# EU VAT Rates and Euro Exchange Rates (`vizellie/eu-vat-fx-rates`) Actor

Standard and reduced VAT rates for the 27 EU member states, plus ECB euro reference exchange rates, in one dataset. Get the latest rates, one date or a range, and convert amounts. $0.004 per country VAT card and $0.001 per exchange rate.

- **URL**: https://apify.com/vizellie/eu-vat-fx-rates.md
- **Developed by:** [Vi Zellie](https://apify.com/vizellie) (community)
- **Categories:** Business, Developer tools, Automation
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.00 / 1,000 vat rate cards

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

## EU VAT Rates and Euro Exchange Rates

Get a current VAT rate card for each EU member state, and official euro reference exchange rates, in one dataset. Use it for invoices, price lists and a morning check of the rates you actually bill in.

Not legal or tax advice; general information only.

### Who it is for

Finance teams, shops that sell across the EU, and anyone who needs the standard and reduced VAT rates next to a euro rate, without copying them out of a PDF.

### What you get

- One row per member state: standard rate, reduced rates, super-reduced rates and parking rates, with the as-of date and the situation date that came back with the rate.
- One row per currency and day. The rate is how many units of that currency equal one euro.
- The latest rates, one date, or a date range. A single date that falls on a weekend uses the latest published rate on or before that day, up to seven days back, and the row shows that rate date.
- An optional amount conversion, from one currency to another, as its own row.
- A clear note in the run summary when a source does not respond. Rates from the source that did respond are still saved.

Territorial exceptions, such as the Canary Islands, are not folded into the national rate. A country can have more than one reduced rate. Those are listed together on the same row.

### Tutorial

1. Leave **Countries** empty for all 27 member states, or set the markets you bill, for example `NL`, `DE` and `FR`. Greece is `GR`.
2. Leave **VAT as-of date** empty for today, or set a day as `YYYY-MM-DD`.
3. Leave **Currencies** empty for every published currency, or set `USD` and `GBP`.
4. For a history, set **Start date** and **End date**. For one day, set **Rate date**. Leave all three empty for the latest rate of each currency.
5. To convert a sum, set **Amount to convert**, **From currency** and **To currency**. Use `EUR` when one side is already euro.
6. Run the Actor. Open the VAT view and the exchange rate view. The `OUTPUT` record says how many rows were saved, and whether a source was unavailable.
7. Schedule it if you want a standing feed. Rows that were not saved are not charged.

### Example input

```json
{
  "countries": ["NL", "DE", "ES"],
  "currencies": ["USD", "GBP"],
  "amount": 100,
  "fromCurrency": "USD",
  "toCurrency": "EUR",
  "maxRows": 100
}
```

### Example output

One VAT row:

```json
{
  "itemType": "vat-rate",
  "country": "NL",
  "countryName": "Netherlands",
  "asOf": "2026-10-29",
  "standardRate": 21,
  "reducedRates": [9],
  "reducedRatesLabel": "9",
  "superReducedRates": [],
  "superReducedRatesLabel": "",
  "parkingRates": [],
  "parkingRatesLabel": "",
  "situationDate": "2026-07-01",
  "source": "European Commission"
}
```

One exchange rate, and a conversion. `rate` on an exchange rate row is units of that currency for one euro.

```json
{
  "itemType": "fx-rate",
  "currency": "USD",
  "currencyName": "US dollar",
  "base": "EUR",
  "date": "2026-10-28",
  "rate": 1.1133,
  "source": "European Central Bank"
}
```

```json
{
  "itemType": "conversion",
  "amount": 100,
  "fromCurrency": "USD",
  "toCurrency": "EUR",
  "rateDate": "2026-10-28",
  "fromPerEuro": 1.1133,
  "toPerEuro": 1,
  "rate": 0.89823049,
  "convertedAmount": 89.823049,
  "source": "European Central Bank"
}
```

The converted amount is rounded to 6 decimal places. An exchange rate row keeps the published figure. Weekend rows show the working day the rate was actually published.

### Pricing

You pay a small fee when the run starts, then a fee for each row that is saved. A VAT row is one member state. An exchange rate row is one currency on one day. A conversion is charged as one exchange rate row.

| What | Price |
|---|---|
| Run start | $0.00005 |
| VAT rate card (one country) | $0.004 |
| Exchange rate, or one conversion | $0.001 |

Countries with no national standard rate, currencies that are not published, and rows past **Max rows** are not charged. If a source does not respond, you are not charged for rows it did not save.

**Examples**

- All 27 member states and about 30 latest rates: (27 × $0.004) + (30 × $0.001) = $0.108 + $0.030 = **$0.138**, plus the $0.00005 start fee.
- Netherlands, Germany and France, VAT only: 3 × $0.004 = **$0.012**, plus the start fee.
- US dollar for about 20 business days: 20 × $0.001 = **$0.020**, plus the start fee.
- One conversion and nothing else: **$0.001**, plus the start fee.
- A run that saves nothing: **$0.00005**.

Use **Max rows** and Apify's maximum cost per run to cap a single run. The pricing tab on the store is the price you are charged if it ever differs.

### Scheduling and integrations

Save a task and schedule it each working day. The dataset can go to Google Sheets, Slack, email, Make or Zapier, or you can read it from the Apify API. The rows are small enough to pass to an AI agent over MCP.

### No personal data

This Actor does not collect personal data.

- It asks only for published rates. It does not request names, contact details or tax identifiers.
- Free-text notes that sometimes sit next to a rate are not stored.
- Raw responses are not stored.
- Logs and error text are scrubbed the same way, and they do not include the address that was called.

### FAQ

**Which rate is the national one?**
The standard rate without a territorial exception. A reduced rate used only in a special territory is left off the national row.

**Why is a currency missing?**
Reference rates cover the currencies that are published against the euro, not every currency in the world. EUR itself is the base, so it has no row.

**Why does a Monday rate show Friday's date?**
No rate is published on weekends and on TARGET closing days. For a single date, the row keeps the latest published rate on or before the day you asked for, up to seven days back. A date range does not fill those gaps.

**What if a source is down?**
The run summary says which part failed. Rows from the other part are still saved. If both fail, the run stops with that message and no rate rows are charged.

**Where do the figures come from?**
VAT rates are published by the European Commission. Exchange rates are the European Central Bank's euro reference rates. This Actor is not affiliated with either institution. For a tax position, use the national rules. The figures here are general information.

### Next additions

- Which goods sit on each reduced rate, still as one row per country.
- VAT rates across a date range, so a change is visible without guessing the day.
- A short list of amounts converted in one run.
- A saved snapshot, so a schedule can report only a rate that changed.

### Feedback

Missing a currency or a field? Open an issue on the Actor's Issues tab.

# Actor input Schema

## `includeVat` (type: `boolean`):

Save one row per EU member state with the standard rate, reduced rates, super-reduced rates and parking rates on the as-of date.

## `countries` (type: `array`):

EU member state codes, for example NL, DE and FR. Leave empty for all 27. Greece is GR. EL is accepted as well.

## `asOf` (type: `string`):

Rates in force on this day, YYYY-MM-DD. Leave empty for today. The row also shows the situation date returned with the rate.

## `includeRates` (type: `boolean`):

Save euro reference rates. Each rate is how many units of that currency equal one euro.

## `currencies` (type: `array`):

Three-letter codes, for example USD and GBP. Leave empty for every published currency. EUR is the base and has no rate of its own.

## `date` (type: `string`):

One day, YYYY-MM-DD. If that day has no rate, the row uses the latest published rate on or before it, up to seven days back, and shows that rate date.

## `startDate` (type: `string`):

First day of a range, YYYY-MM-DD, inclusive. Use this with End date for a history. Gaps on weekends and holidays are left empty.

## `endDate` (type: `string`):

Last day of a range, YYYY-MM-DD, inclusive. If you set only an end date, you get one rate per currency on or just before that day.

## `amount` (type: `number`):

Optional. Converts this amount from one currency to another using the euro reference rates. Adds one conversion row.

## `fromCurrency` (type: `string`):

Currency of the amount, for example USD. Use EUR if the amount is already in euro.

## `toCurrency` (type: `string`):

Currency you want, for example GBP or EUR.

## `maxRows` (type: `integer`):

Most rows saved in one run, from 1 to 5000. VAT rows are kept first, then exchange rates, then the conversion. Default 500.

## Actor input object example

```json
{
  "includeVat": true,
  "countries": [
    "NL",
    "DE",
    "FR"
  ],
  "asOf": "2026-10-29",
  "includeRates": true,
  "currencies": [
    "USD",
    "GBP"
  ],
  "date": "2026-10-28",
  "startDate": "2026-10-01",
  "endDate": "2026-10-28",
  "amount": 100,
  "fromCurrency": "USD",
  "toCurrency": "EUR",
  "maxRows": 10
}
```

# Actor output Schema

## `vatRates` (type: `string`):

One row per member state, with standard, reduced, super-reduced and parking rates.

## `exchangeRates` (type: `string`):

One row per currency and date, plus a conversion row when you set an amount.

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

The OUTPUT record in the default key-value store.

# 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 = {
    "countries": [
        "NL"
    ],
    "currencies": [
        "USD"
    ],
    "maxRows": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("vizellie/eu-vat-fx-rates").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 = {
    "countries": ["NL"],
    "currencies": ["USD"],
    "maxRows": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("vizellie/eu-vat-fx-rates").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 '{
  "countries": [
    "NL"
  ],
  "currencies": [
    "USD"
  ],
  "maxRows": 10
}' |
apify call vizellie/eu-vat-fx-rates --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,vizellie/eu-vat-fx-rates"
        }
    }
}
```

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/wmgyJeB7Z5zL7pXZt/builds/vRHWOPIbvhY3Bxhw1/openapi.json
