Daily benchmark assessment · 16 July 2026

OLEA MARKETS The global olive oil price benchmark

Olea Price API

Olea Markets publishes Olea Price, a daily benchmark for olive oil producer prices in the world's leading producing markets, built exclusively from official and semi-official public sources. Every published value carries a reliability block and is bit-for-bit reproducible under methodology v1.0.0.

Getting started

Base URL: https://api.oleamarkets.com. All price data is in EUR/kg (3 decimals); stocks are in metric tons. Values are published daily.

Grab a key at oleamarkets.com/pricing (every plan starts with a 7-day free trial), then:

curl -H "Authorization: Bearer olea_YOUR_KEY" https://api.oleamarkets.com/v1/latest

Five indices are published: OLEA-EVOO-ES, OLEA-VIRGIN-ES, OLEA-LAMP-ES, OLEA-EVOO-IT and OLEA-EVOO-EU (EU production-weighted composite).

Authentication

All endpoints except GET /v1/status, this page and POST /mcp require an API key, passed either way:

curl -H "Authorization: Bearer olea_YOUR_KEY" https://api.oleamarkets.com/v1/latest
curl "https://api.oleamarkets.com/v1/latest?apikey=olea_YOUR_KEY"

Response envelope

Every JSON response — success and error — uses the same envelope. Success:

{
  "success": true,
  "data": { "...": "endpoint-specific" },
  "unit": "EUR/kg",
  "metric": "price.index.latest",
  "reliability": {
    "sources_count": 3,
    "observations_count": 17,
    "confidence": 0.87,
    "last_updated": "2026-07-14T06:00:12Z",
    "methodology_version": "1.0.0",
    "methodology_url": "https://oleamarkets.com/methodology"
  },
  "meta": { "request_id": "3f7f0f1e-8f0a-4a52-9f9b-1c2d3e4f5a6b", "credits_used": 1 }
}

The reliability block tells you how much the number can be trusted: how many sources and observations produced it, a 0–1 confidence score and the exact methodology version. Values carried forward on days without fresh observations are flagged "stale": true.

Endpoints

Eight endpoints under /v1, each documented below with its parameters, an example request and an example response. Endpoints marked require a paid plan.

GET/v1/status — Service healthno key

Pipeline health: per-source freshness plus latest value, date, confidence and stale flag of each index. metric: meta.status, credits_used: 0.

Example request

curl https://api.oleamarkets.com/v1/status

GET/v1/symbols — The five indices

Metadata for all published indices. metric: meta.symbols. data is a list of:

Example request

curl -H "Authorization: Bearer olea_YOUR_KEY" https://api.oleamarkets.com/v1/symbols

Example item

{
  "code": "OLEA-EVOO-ES",
  "label": "Olea Price — Extra Virgin Olive Oil, Spain",
  "grade": { "code": "evoo", "label": "Extra Virgin Olive Oil" },
  "country": "ES",
  "scope": "country",
  "unit": "EUR/kg",
  "decimals": 3,
  "frequency": "daily",
  "methodology_version": "1.0.0",
  "methodology_url": "https://oleamarkets.com/methodology"
}

The EU composite (OLEA-EVOO-EU) has country: null and scope: "eu_composite".

GET/v1/latest — Latest index value

Latest published value of one index — or of all five — with 1-day, 1-week and 1-year percentage changes. metric: price.index.latest.

Parameters

ParamRequiredDescription
indexnoIndex code. Omit for all five indices (then data is a list).

Example request

curl -H "Authorization: Bearer olea_YOUR_KEY" \
  "https://api.oleamarkets.com/v1/latest?index=OLEA-EVOO-ES"

Example response (data)

{
  "index": "OLEA-EVOO-ES",
  "date": "2026-07-14",
  "value_eur_kg": 4.512,
  "change_1d": -0.35,
  "change_1w": 1.12,
  "change_1y": -23.4,
  "stale": false
}

Changes are percentages vs the closest value at or before 1 day / 1 week / 1 year earlier; null when there is no history that far back.

GET/v1/historical — Daily historical series

Daily series of one index between two dates. Starter plans see at most 1 year back from today: the range is clamped and data.plan_limited is set to true. Pro and Business have full history. metric: price.index.historical.

Parameters

ParamRequiredDescription
indexyesIndex code.
fromnoY-m-d. Defaults to one year before to.
tonoY-m-d. Defaults to today.

Example request

curl -H "Authorization: Bearer olea_YOUR_KEY" \
  "https://api.oleamarkets.com/v1/historical?index=OLEA-EVOO-ES&from=2026-01-01&to=2026-07-14"

Example response (data)

{
  "index": "OLEA-EVOO-ES",
  "from": "2026-01-01",
  "to": "2026-07-14",
  "plan_limited": false,
  "count": 195,
  "series": [
    { "date": "2026-01-01", "value_eur_kg": 4.702, "confidence": 0.91, "stale": false }
  ]
}

GET/v1/regional — Regional observations

Non-quarantined price observations from the last 30 days. All filters optional.

Parameters

ParamDescription
countryISO2, e.g. ES.
regione.g. jaen.
gradeevoo, virgin, lampante, refined, pomace.

Example request

curl -H "Authorization: Bearer olea_YOUR_KEY" \
  "https://api.oleamarkets.com/v1/regional?country=ES®ion=jaen&grade=evoo"

data: { "window_days": 30, "count": N, "observations": [...] } where each observation carries date, source, quality_grade, country, region, market, price_eur_kg and volume_tons. metric: price.observations.regional.

GET/v1/spread — Spread between grades

Spread between two quality grades: absolute (a - b) and % vs b. Each leg uses the latest index value when an index covers the (grade, country) pair (basis: "index"), otherwise the plain mean of publishable observations from the last 30 days (basis: "observations"). metric: price.spread.

Parameters

ParamRequiredDescription
ayesFirst grade (minuend).
byesSecond grade (base of the % spread).
countrynoISO2, default ES.

Example request

curl -H "Authorization: Bearer olea_YOUR_KEY" \
  "https://api.oleamarkets.com/v1/spread?a=evoo&b=lampante&country=ES"

Example response (data)

{
  "country": "ES",
  "a": { "grade": "evoo", "basis": "index", "index": "OLEA-EVOO-ES", "date": "2026-07-14", "value_eur_kg": 4.512 },
  "b": { "grade": "lampante", "basis": "index", "index": "OLEA-LAMP-ES", "date": "2026-07-14", "value_eur_kg": 3.401 },
  "spread_abs_eur_kg": 1.111,
  "spread_pct": 32.67
}

GET/v1/stocks — Market stocks

Official stock data in tons, ordered by month descending. unit: tons, metric: market.stocks.

Parameters

ParamDescription
countryISO2 filter, optional.

Example request

curl -H "Authorization: Bearer olea_YOUR_KEY" "https://api.oleamarkets.com/v1/stocks?country=ES"

data.rows[]: country, campaign, month, stock_tons, outflow_tons, production_tons, source.

GET/v1/sources — Data sources

Sources with tier (official, semi_official, cooperative, press) and freshness: timestamp of the last successful raw fetch and date of the last observation. metric: meta.sources, unit: none.

Example request

curl -H "Authorization: Bearer olea_YOUR_KEY" https://api.oleamarkets.com/v1/sources

Errors & codes

Errors use the same envelope with success: false and an error object:

Example error response

{
  "success": false,
  "data": null,
  "unit": null,
  "metric": null,
  "reliability": null,
  "error": {
    "code": "payment_required",
    "message": "This endpoint requires a paid plan (starter, pro or enterprise). See https://oleamarkets.com/pricing to upgrade.",
    "docs_url": "https://oleamarkets.com/docs"
  },
  "meta": { "request_id": "3f7f0f1e-8f0a-4a52-9f9b-1c2d3e4f5a6b", "credits_used": 0 }
}

Error codes

CodeHTTPWhen
unauthenticated401Missing or invalid API key.
payment_required403The key's plan does not include this endpoint.
not_found404No data matches the request.
validation_error422Invalid parameters.
quota_exceeded429Monthly quota exhausted (capped at 100 calls during an active trial).
rate_limited429Per-minute rate limit hit.

Rate limits & plans

Billed monthly or annually (annual = 2 months free) via Stripe — in EUR inside Europe and USD elsewhere, with the same numerals in both currencies. Prices below are per month; the annual plan is ten times the monthly price. Every plan includes all markets and daily index updates. Sign up at oleamarkets.com/pricing.

PlanPrice / monthMonthly quotaRate limitWidget viewsHistory depthSupport
Starter $99.99 / €99.99 10,000 calls 60 req/min 1,000/day 1 year back from today Email support
Pro $199.99 / €199.99 50,000 calls 120 req/min 10,000/day Full history Priority support
Business
API plan code: enterprise
$499.99 / €499.99 250,000 calls 240 req/min 100,000/day Full history Specialized support
Enterprise From $10,000 / €10,000 per year Custom Custom Custom Full history Dedicated support & SLA

Enterprise is custom — contact us: custom rate limits and quotas, redistribution licence, dedicated support & SLA and onboarding, from $10,000 / €10,000 per year. Write to [email protected].

Every plan starts with a 7-day free trial limited to 100 calls: while the trial is active the effective monthly quota is capped at 100 requests, and hitting that cap returns 429 quota_exceeded with a trial-specific message. Once the trial converts, the full plan quota applies.

Paid endpoints (historical, regional, spread, stocks) return 403 payment_required on keys without a paid plan. Exhausting the monthly quota returns 429 quota_exceeded; exceeding the per-minute rate limit returns 429 rate_limited.

MCP server

AI agents can talk to the API natively over the Model Context Protocol: POST https://api.oleamarkets.com/mcp (JSON-RPC 2.0, MCP protocol revision 2025-03-26). Point any MCP-capable client (Claude, IDE agents, etc.) at that endpoint as a remote HTTP server.

Tools

ToolArgumentsAuth
get_olive_oil_priceindex (optional)none
get_price_historyindex, from, topaid key via Authorization: Bearer
compare_gradesa, b, countrynone
get_market_stockscountry (optional)none
get_sources_statusnone

Example request

curl -X POST https://api.oleamarkets.com/mcp \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"get_olive_oil_price","arguments":{"index":"OLEA-EVOO-ES"}}}'

OpenAPI spec

The full machine-readable OpenAPI 3.1 description of every endpoint, schema and error lives at https://api.oleamarkets.com/openapi.json — generate clients, import it into Postman or feed it to your agent. A condensed plain-text summary for LLMs is at https://api.oleamarkets.com/llms.txt.