# EU Agricultural Commodity Prices — Beef, Pork, Dairy, Grain (`nexgensignal/eu-agri-food-price-records`) Actor

Official EU market prices from the European Commission's Agri-food Data Portal: beef, pork, lamb, poultry, eggs, dairy, raw milk, cereals, oilseeds, rice, olive oil, fruit and vegetables by country and week. Part of NexGen Signal — official-source data products

- **URL**: https://apify.com/nexgensignal/eu-agri-food-price-records.md
- **Developed by:** [NexGen Signal](https://apify.com/nexgensignal) (community)
- **Categories:** Business, Developer tools, News
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $33.50 / 1,000 agri-food price records

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

## EU Agricultural Commodity Prices — Beef, Pork, Dairy, Grain

**Official source. No API key. Pay per record.**

This actor gives you the European Commission's official agricultural market prices as structured records, read from the Agri-food Data Portal's own price API (run by the Commission's agriculture department, DG AGRI). These are the prices member states report to the Commission every week or month under EU market rules — the numbers the Commission uses to watch farm markets.

Thirteen series are covered in one actor:

| Sector | What it holds |
|---|---|
| `beef` | Carcass prices by category (young bulls, cows, heifers…) and grade |
| `pigmeat` | Pig carcass prices by class, plus piglets |
| `sheepAndGoat` | Lamb and sheep prices by category and market |
| `liveAnimal` | Live calf and cattle prices |
| `poultry` | Broiler and other poultry meat prices |
| `eggs` | Egg prices by farming method (cage, barn, free range, organic) |
| `dairy` | Butter, cheeses, milk powders |
| `rawMilk` | Monthly raw milk prices |
| `cereal` | Wheat, barley, maize, durum… by market and delivery stage |
| `oilseeds` | Rapeseed, sunflower, soya by market and stage |
| `rice` | Rice by stage, type and variety |
| `oliveOil` | Olive oil by grade and market |
| `fruitAndVegetable` | Fruit and vegetable prices by variety and supply-chain stage |

For just the three weeks ending 6, 13 and 20 September 2026, beef, pork, cereals and dairy came to **3,065 price rows** across the member states (beef 1,948, cereals 720, pigmeat 205, dairy 192). Some series go back decades: beef prices for Germany are available at least from January 1991.

### Who buys this and for what job

- **Commodity traders, agri-food buyers and procurement teams** tracking EU livestock, dairy and grain prices by country, week by week.
- **Food manufacturers and retailers** watching input costs (milk, butter, wheat, pork) across their sourcing countries.
- **Farm advisers, co-operatives and agricultural lenders** benchmarking local prices against other member states.
- **Analysts, economists and journalists** following food inflation and farm incomes from the official source.
- **Data teams** who need a clean feed without handling the portal's per-sector formats.

### Sample output

![Sample output — EU Agricultural Commodity Prices](https://api.apify.com/v2/key-value-stores/IXCaMKjxSmUTLHhmq/records/eu-agri-food-price-records.png)

```json
{
  "record_id": "AGRI:cereal:7bc323cc68e33fad",
  "sector": "cereal",
  "sector_name": "Cereal prices",
  "member_state_code": "AT",
  "member_state_name": "Austria",
  "begin_date_iso": "2026-09-14",
  "end_date_iso": "2026-09-20",
  "price_value": 217.5,
  "unit": "TONNES",
  "memberStateCode": "AT",
  "memberStateName": "Austria",
  "beginDate": "14/09/2026",
  "endDate": "20/09/2026",
  "price": "€217,50",
  "weekNumber": 12,
  "productName": "Feed wheat",
  "marketName": "Wels",
  "stageName": "Departure from silo - after some storage - on truck or other transport means",
  "referencePeriod": "24/09/2026",
  "api_url": "https://api.tech.ec.europa.eu/agrifood/api/cereal/prices?beginDate=01/09/2026&endDate=30/09/2026",
  "source": "European Commission, DG Agriculture and Rural Development — Agri-food Data Portal price API (https://api.tech.ec.europa.eu/agrifood/api/)",
  "licence": "Creative Commons Attribution 4.0 (CC BY 4.0) — the portal's Legal notice (commission.europa.eu/legal-notice_en) states that EU-owned content 'is licensed under the Creative Commons Attribution 4.0 International (CC BY 4.0) licence'.",
  "attribution": "Source: European Commission, Agri-food Data Portal (CC BY 4.0); reformatted by NexGen Signal.",
  "observed_at": "2026-09-28T03:25:49Z"
}
```

### Pricing

| Apify plan | Price per record |
|---|---|
| Free | $0.05 |
| Bronze | $0.045 |
| Silver | $0.04 |
| Gold and above | $0.0335 |

You pay only for records delivered to your dataset. `maxRecords` caps what a run can cost: 500 records cost $25 on the Free plan. Filtering by country, dates and product is free.

### Input

| Field | What it does | Default |
|---|---|---|
| `sectors` | Which series to read (see the table above) | beef, pigmeat, cereal, dairy |
| `memberStates` | Two-letter country codes, e.g. `DE`, `FR`, `PL` | all |
| `lastWeeks` | Only price periods in the last N weeks | last 8 weeks if no dates are given |
| `fromDate`, `toDate` | Only price periods overlapping these dates (YYYY-MM-DD) | 8 weeks ago → today |
| `productContains` | Keep rows whose product, category, variety, stage or market contains this text, e.g. `durum`, `butter`, `heifers` | none |
| `maxRecords` | Maximum records delivered and billed | 500 |

Newest periods come first. Within each period the sectors take turns, so a small run shows every sector you picked instead of filling up with the largest one.

Example — this month's butter and cheese prices in Germany, France and the Netherlands:

```json
{"sectors": ["dairy"], "memberStates": ["DE", "FR", "NL"], "lastWeeks": 4, "maxRecords": 500}
```

Example — durum wheat in France and Italy since January 2025:

```json
{"sectors": ["cereal"], "memberStates": ["FR", "IT"], "productContains": "durum", "fromDate": "2025-01-01", "maxRecords": 2000}
```

(On 27 September 2026 that returned 633 rows in 81 seconds.)

### Output

| Field | Meaning |
|---|---|
| `record_id` | `AGRI:<sector>:<row fingerprint>` — unique per price row |
| `sector`, `sector_name` | The series the row came from |
| `member_state_code`, `member_state_name` | Country (copies of the API's fields) |
| `begin_date_iso`, `end_date_iso` | The price period as YYYY-MM-DD |
| `price_value` | The price as a number, parsed from the published text |
| `unit` | Unit as published: `€/100Kg`, `TONNES`, `100KG`, `€/head`, `national currency/ton`… |
| `price` and every other API field | Exactly as the API returns them, under the API's own names (`category`, `productCode`, `productName`, `marketName`, `stageName`, `weekNumber`, `farmingMethod`, `variety`…) |
| `api_url`, `source`, `licence`, `attribution`, `observed_at` | Provenance on every record |

The fields differ by sector because the Commission's series differ; nothing is renamed or merged across sectors.

### Cost guidance

Beef, pork, cereals and dairy for all countries come to about 1,000 rows a week (3,065 for three weeks in September 2026), so a weekly run of those four costs about $34 on Gold; beef alone is about 650 rows a week. Smaller series are much cheaper: all 13 sectors for France over six weeks were 519 rows ($17 on Gold). One country is much smaller: all 13 sectors for France over six weeks were 359 rows ($12 on Gold). Narrow with `memberStates` and `productContains` for regular monitoring.

### Tips

- **Weekly monitoring:** schedule a run each Thursday or Friday with `lastWeeks: 2` and the sectors and countries you follow; the newest week is delivered first.
- **Compare like with like:** filter with `productContains` (for example `heifers`, `butter`, `milling wheat`) and compare rows that share the same `unit` and market or stage.
- **Back-fill once:** take the history you need in one run with `fromDate`, then switch to the weekly schedule.
- **Currency:** most series are in euros; where `unit` says national currency, convert with the ECB rate for that week before comparing.

### How a run works

The actor checks robots.txt, then asks the Commission's API for each chosen sector one calendar month at a time, newest month first. Because the API returns only periods lying wholly inside the requested dates, each monthly request starts six days before the month, so weeks that cross a month end are not lost; rows seen twice are dropped. The API also answers "server error" for a moment now and then, even on small requests — one test run needed 4 retries across 21 requests — so every request is spaced out and retried with growing waits; in testing every retried request came through. Records are pushed to your dataset first and charged only after they are delivered; if you set a maximum charge, the run stops cleanly when it is reached. Test runs took 4–81 seconds depending on sectors and dates. Every run saves a receipt (`RUN_RECEIPT`) with the robots decision, requests, retries, rows per sector and any request that still failed. If the API stays down, the run ends with a clear message and charges only what was delivered.

### Honest limitations

- **Reported averages, not trades.** These are the representative prices member states report to the Commission, not transaction-level or futures prices.
- **Not every country reports every product.** Olive oil, for example, comes from producing countries only.
- **The "€" in `price` is the API's.** Where a price is published its text starts with "€", but some series give the unit as "national currency/…". Check `unit` before comparing countries. A few rows, such as some EU-wide cereal averages, carry no price at all.
- **Country codes are the Commission's.** Greece is `GR` in some series and `EL` in others (asking for either returns both), and some series add averages such as `EU` and `EU+UK`.
- **Decimal comma.** Some series publish prices like "€217,50"; `price_value` reads that as 217.5, and the original text stays in `price`.
- **Different periods.** Most series are weekly; raw milk is monthly. Week numbers follow each series' own calendar (cereals and oilseeds count weeks within the marketing year).
- **Wine and a few smaller series** in the portal are not included.
- **The API can be slow or flaky.** Large historical pulls take longer because of the retry pacing.

### Licence and attribution

The Agri-food Data Portal's footer links to the European Commission's legal notice, which says EU-owned content "is licensed under the Creative Commons Attribution 4.0 International (CC BY 4.0) licence". Every record carries the credit *Source: European Commission, Agri-food Data Portal (CC BY 4.0); reformatted by NexGen Signal.* This actor is not affiliated with or endorsed by the European Commission.

### Differentiation

Commodity actors on the Store — such as scrapemint/commodity-futures-settlements (exchange futures), martc03/usda-crop-prices (US) and codeclouds/agrigrondstofprijzen-monitor (one national market) — cover other markets or single sources. This actor covers the EU's own official price reporting for 13 sectors and every member state in one input, with each series' fields kept as the Commission publishes them.

### The NexGen Signal family

Part of NexGen Signal — official-source data products, no API keys, pay per record. Related actors:

- [Italy Fuel Price Observations - MIMIT](https://apify.com/nexgensignal/it-fuel-price-observation-records)
- [EU Geographical Indication Records — eAmbrosia](https://apify.com/nexgensignal/eu-geographical-indication-records)
- [Eurostat Business & Consumer Confidence — Monthly](https://apify.com/nexgensignal/eurostat-business-confidence)
- [National Macro Indicator Records — World Bank](https://apify.com/nexgensignal/national-macro-indicator-records)
- [Colombia Medicine Price Benchmarks — SISMED](https://apify.com/nexgensignal/co-medicine-price-records)

# Actor input Schema

## `sectors` (type: `array`):

Which of the Commission's price series to read.

## `memberStates` (type: `array`):

Only these countries (two-letter codes, e.g. DE, FR, PL; EU for EU averages where published). Leave empty for all.

## `lastWeeks` (type: `integer`):

Only prices for periods in the last N weeks. If no dates are given at all, the last 8 weeks are read.

## `fromDate` (type: `string`):

Optional. Only price periods ending on or after this day (YYYY-MM-DD). Some series go back to 1991.

## `toDate` (type: `string`):

Optional. Only price periods starting on or before this day (YYYY-MM-DD). Default today.

## `productContains` (type: `string`):

Optional. Keep only rows whose product, category, variety, stage or market text contains this (not case-sensitive), e.g. durum, butter, heifers.

## `maxRecords` (type: `integer`):

Maximum records delivered and billed in this run. Newest months come first.

## Actor input object example

```json
{
  "sectors": [
    "beef",
    "pigmeat",
    "cereal",
    "dairy"
  ],
  "memberStates": [],
  "maxRecords": 10
}
```

# Actor output Schema

## `results` (type: `string`):

The delivered records.

# 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 = {
    "sectors": [
        "beef",
        "pigmeat",
        "cereal",
        "dairy"
    ],
    "maxRecords": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("nexgensignal/eu-agri-food-price-records").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 = {
    "sectors": [
        "beef",
        "pigmeat",
        "cereal",
        "dairy",
    ],
    "maxRecords": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("nexgensignal/eu-agri-food-price-records").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 '{
  "sectors": [
    "beef",
    "pigmeat",
    "cereal",
    "dairy"
  ],
  "maxRecords": 10
}' |
apify call nexgensignal/eu-agri-food-price-records --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,nexgensignal/eu-agri-food-price-records"
        }
    }
}
```

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/fx2PXLLU5jRcHhvx6/builds/IjZxI7qfa15hHfZdB/openapi.json
