Borsa Italiana Scraper - Financial Data Extractor avatar
Borsa Italiana Scraper - Financial Data Extractor

Pricing

from $1.30 / 1,000 results

Go to Apify Store
Borsa Italiana Scraper - Financial Data Extractor

Borsa Italiana Scraper - Financial Data Extractor

Complete Borsa Italiana scraper extracting 23-41 fields per instrument depending on type (stocks, ETFs, funds, bonds, BTPs, ETCs). Track portfolios, analyze performance trends, monitor year high/low, compare fees & benchmarks. Auto number parsing, proxy support, clean JSON output.

Pricing

from $1.30 / 1,000 results

Rating

5.0

(1)

Developer

njoylab

njoylab

Maintained by Community

Actor stats

0

Bookmarked

3

Total users

2

Monthly active users

13 days ago

Last modified

Share

Borsa Italiana Scraper - Apify Actor

Extracts comprehensive real-time financial data from instruments listed on Borsa Italiana (BTP, stocks, bonds, ETFs, funds, etc.).

What does this actor do?

This actor scrapes extensive financial data from instrument pages on Borsa Italiana, including:

  • Real-time prices and percentage changes
  • Performance metrics (1M, 6M, 1Y, YTD)
  • Year high/low with dates
  • Trading data (volumes, turnover, number of trades)
  • Instrument-specific data (sector for stocks, benchmark for ETFs, NAV for funds)

Features:

  • Data extraction from multiple URLs in parallel
  • Apify Proxy support to avoid rate limiting
  • Automatic error handling (saves failed URLs in dataset)
  • Automatic conversion of number format (1.234,56 → 1234.56)
  • Multi-language support (Italian and English pages)
  • Structured JSON output

Input

Parameters

FieldTypeRequiredDefaultDescription
urlsArray[String]✅ Yes-List of Borsa Italiana instrument URLs or ISIN codes to scrape. You can mix URLs and ISINs in the same list. ISINs are case-insensitive (e.g., IT0005239360, it0005239360).
langStringNo''Preferred language for all URLs. Options: '' (default/no override), 'it' (Italian), 'en' (English). If specified, appends/overrides ?lang= parameter to all URLs.
useApifyProxyBooleanNotrueEnable Apify Proxy for requests
proxyGroupsArray[String]No[]Apify proxy groups (e.g., ["RESIDENTIAL"])
maxConcurrencyIntegerNo5Maximum number of parallel requests
requestTimeoutSecsIntegerNo15Timeout for each request (in seconds)

Example Input

{
"urls": [
"https://www.borsaitaliana.it/borsa/obbligazioni/mot/btp/scheda/IT0005565400.html",
"IT0005239360",
"it0005565400"
],
"lang": "it",
"useApifyProxy": true,
"proxyGroups": [],
"maxConcurrency": 5,
"requestTimeoutSecs": 15
}

How to get URLs or ISINs

Option 1: Use full URLs

  1. Go to Borsa Italiana
  2. Search for the instrument you're interested in (BTP, stock, bond, etc.)
  3. Go to the instrument detail page
  4. Copy the full URL from the address bar

Option 2: Use ISIN codes (simpler!)

  1. Find the ISIN code of the instrument (12 characters: 2 letters + 10 alphanumeric)
  2. Add it directly to the urls array
  3. ISINs are case-insensitive: IT0005239360, it0005239360, or It0005239360 all work

Example valid inputs:

Full URLs:

  • BTP: https://www.borsaitaliana.it/borsa/obbligazioni/mot/btp/scheda/IT0005565400.html
  • Stock: https://www.borsaitaliana.it/borsa/azioni/mercato-telematico-azionario/scheda/IT0003128367.html
  • ETF: https://www.borsaitaliana.it/borsa/etf/scheda/IE00B4L5Y983.html

ISIN Codes:

  • Italian BTP: IT0005565400
  • Italian Stock: IT0005239360 (UniCredit)

Mixed Example:

{
"urls": [
"https://www.borsaitaliana.it/borsa/azioni/scheda/IT0005239360.html",
"IT0005565400"
]
}

Language Override

The lang parameter allows you to force a specific language for all scraped pages:

  • Empty string "" (default): Uses URLs exactly as provided
  • "it": Forces Italian - adds/overrides ?lang=it to all URLs
  • "en": Forces English - adds/overrides ?lang=en to all URLs

Examples:

Force all pages to Italian:

{
"urls": ["https://www.borsaitaliana.it/borsa/azioni/scheda/IT0000062072.html"],
"lang": "it"
}

URLs with existing ?lang=en will be overridden:

{
"urls": ["https://www.borsaitaliana.it/borsa/azioni/scheda/IT0000062072.html?lang=en"],
"lang": "it"
}
// Final URL: ...?lang=it (overridden)

Output

Extracted Fields

For each successfully scraped URL, the actor extracts comprehensive data. Note: Only fields with actual data are included in the output (null fields are automatically removed).

📊 Common Fields (All Instruments)

FieldTypeDescriptionExample
urlStringInstrument URL"https://www.borsaitaliana.it/..."
instrumentNameStringInstrument name"Generali"
isinStringISIN code"IT0000062072"
instrumentIdStringInternal instrument ID"123456"
alphanumericCodeStringTrading code"G"

💰 Price Data

FieldTypeDescriptionExample
valueNumberCurrent price (parsed)34.82
valueStringStringCurrent price (original format)"34,82"
percValueNumberPercentage change (parsed)-0.74
percValueStringStringPercentage change (original)"-0,74%"
openNumberOpening price35.09
openStringStringOpening price (original)"35,09"
dayHighNumberDaily high35.20
dayHighStringStringDaily high (original)"35,20"
dayLowNumberDaily low34.80
dayLowStringStringDaily low (original)"34,80"

📈 Performance Metrics

FieldTypeDescriptionExample
performance1MonthNumber1-month performance2.29
performance1MonthStringString1-month performance (original)"+2,29%"
performance6MonthsNumber6-month performance13.87
performance6MonthsStringString6-month performance (original)"+13,87%"
performance1YearNumber1-year performance23.39
performance1YearStringString1-year performance (original)"+23,39%"
performanceYTDNumberYear-to-date performance5.21
performanceYTDStringStringYear-to-date (original)"+5,21%"
yearHighNumber52-week high price36.40
yearHighStringString52-week high (original)"36,40"
yearHighDateStringDate of 52-week high"06/01/26"
yearLowNumber52-week low price34.94
yearLowStringString52-week low (original)"34,94"
yearLowDateStringDate of 52-week low"08/01/26"

📊 Trading Data

FieldTypeDescriptionExample
lastTradeTimeStringLast transaction time"17:38:18"
referenceDateStringReference date"08/01/2026"
volumeTotalNumberTotal volume2680000
volumeTotalStringStringTotal volume (original)"2.680.000"
volumeLastNumberLast transaction volume20000
volumeLastStringStringLast volume (original)"20.000"
numberOfTradesNumberNumber of trades4916
numberOfTradesStringStringNumber of trades (original)"4.916"
turnoverNumberTurnover value1890.60
turnoverStringStringTurnover (original)"1.890,60"

🏢 Stock-Specific Fields

FieldTypeDescriptionExample
superSectorStringIndustry sector"Assicurazioni"

📦 ETF-Specific Fields

FieldTypeDescriptionExample
benchmarkStringReference index"FTSE MTS MP HRM-W AM"
benchmarkStyleStringBenchmark style"Obbligazionario"
benchmarkAreaStringBenchmark area"GOVERNMENT BONDS - EUR"
totalAnnualFeesNumberAnnual fees percentage0.165
totalAnnualFeesStringStringAnnual fees (original)"0.165%"
dividendsPolicyStringDividend policy"CAPITALIZED"
segmentStringETF segment"ETF Indicizzati"

💼 Fund-Specific Fields

FieldTypeDescriptionExample
fundManagerStringFund management company"Amundi"
lastNavNumberLast NAV111.41
lastNavStringStringLast NAV (original)"111,41"
lastNavDateStringLast NAV date"08/01/26"

🏦 Bond-Specific Fields

FieldTypeDescriptionExample
issuerStringBond issuer"Governo Italiano"
guarantorStringGuarantor"MEF"
seniorityStringSubordination level"Senior"
couponFrequencyStringCoupon frequency"Semestrale"
periodicCouponRateNumberPeriodic coupon rate2.5
annualCouponRateNumberAnnual coupon rate5.0
grossYieldToMaturityNumberGross yield to maturity3.8
netYieldToMaturityNumberNet yield to maturity3.3
expiryDateStringMaturity date"01/10/2028"

🏪 Market Information

FieldTypeDescriptionExample
marketStringTrading market"MTA"
lotSizeNumberMinimum lot size1
negotiationCurrencyStringTrading currency"EUR"
tradingTypeStringTrading type"Continua"

⚠️ Error Handling

FieldTypeDescriptionExample
errorStringError message (only if failed)"Request failed"

Note:

  • Each numeric field has both a Number version (for calculations) and a String version (original format)
  • Only fields with actual data are included in the output
  • Different instrument types have different fields (e.g., stocks have superSector, ETFs have benchmark)

Example Output

Stock Example (Generali)

{
"url": "https://www.borsaitaliana.it/borsa/azioni/mercato-telematico-azionario/scheda/IT0000062072.html",
"instrumentName": "Generali",
"isin": "IT0000062072",
"alphanumericCode": "G",
"value": 34.82,
"valueString": "34,82",
"percValue": -0.74,
"percValueString": "-0,74%",
"lastTradeTime": "17:38:18",
"open": 35.09,
"openString": "35,09",
"performance1Month": 2.29,
"performance1MonthString": "+2,29%",
"performance6Months": 13.87,
"performance6MonthsString": "+13,87%",
"performance1Year": 23.39,
"performance1YearString": "+23,39%",
"yearHigh": 36.4,
"yearHighString": "36,40",
"yearHighDate": "06/01/26",
"yearLow": 34.94,
"yearLowString": "34,94",
"yearLowDate": "08/01/26",
"superSector": "Assicurazioni"
}

ETF Example

{
"url": "https://www.borsaitaliana.it/borsa/etf/scheda/LU1287023342.html",
"instrumentName": "Amd Eur H Rtd Mcro-Wgh Gvn Bd Ucits Etf",
"isin": "LU1287023342",
"alphanumericCode": "EMAAA",
"value": 126.04,
"valueString": "126,04",
"percValue": -0.12,
"percValueString": "-0,12%",
"lastTradeTime": "15:32:04",
"volumeTotal": 15,
"volumeTotalString": "15",
"open": 126.04,
"openString": "126,04",
"numberOfTrades": 1,
"numberOfTradesString": "1",
"turnover": 1890.6,
"turnoverString": "1.890,60",
"performance1Month": 0.51,
"performance1MonthString": "+0,51%",
"performance6Months": -0.21,
"performance6MonthsString": "-0,21%",
"performance1Year": 0.34,
"performance1YearString": "+0,34%",
"performanceYTD": 0.21,
"performanceYTDString": "+0,21%",
"yearHigh": 126.38,
"yearHighString": "126,38",
"yearHighDate": "07/01/26",
"yearLow": 125.67,
"yearLowString": "125,67",
"yearLowDate": "02/01/26",
"issuer": "MULTI UNITS LUXEMBOURG",
"benchmark": "FTSE MTS MP HRM-W AM",
"benchmarkStyle": "Obbligazionario",
"benchmarkArea": "GOVERNMENT BONDS - EUR",
"segment": "ETF Indicizzati",
"lotSize": 1,
"lotSizeString": "1,00"
}

Fund Example

{
"url": "https://www.borsaitaliana.it/borsa/fondi/scheda/LU1397788552.html",
"instrumentName": "Finlabo Dynamic Equity - Classe L",
"isin": "LU1397788552",
"alphanumericCode": "FINLDE",
"value": 111.41,
"valueString": "111,41",
"percValue": 0.34,
"percValueString": "+0,34%",
"performance1Month": 2.46,
"performance1MonthString": "+2,46%",
"performance6Months": 4.46,
"performance6MonthsString": "+4,46%",
"performance1Year": 9.29,
"performance1YearString": "+9,29%",
"performanceYTD": 1.61,
"performanceYTDString": "+1,61%",
"yearHigh": 111.41,
"yearHighString": "111,41",
"yearHighDate": "08/01/26",
"yearLow": 110.5,
"yearLowString": "110,50",
"yearLowDate": "05/01/26",
"lastNav": 111.41,
"lastNavString": "111,41",
"lotSize": 1,
"lotSizeString": "1,00",
"market": "ATFund"
}

Example Output with Error

If a URL fails, the actor still saves the entry in the dataset with the error field:

{
"url": "https://www.borsaitaliana.it/invalid-url",
"error": "Request failed"
}

Proxy Configuration

How to configure Proxies

Without proxies:

{
"urls": ["..."],
"useApifyProxy": false
}

With automatic Apify proxies:

{
"urls": ["..."],
"useApifyProxy": true
}

With residential proxies (recommended for large volumes):

{
"urls": ["..."],
"useApifyProxy": true,
"proxyGroups": ["RESIDENTIAL"]
}

Note: Residential proxies consume more Apify credits but are more reliable for avoiding blocks.

Performance

Concurrency (Parallel Requests)

The maxConcurrency parameter controls how many pages are scraped simultaneously.

Recommended values:

ScenarioConcurrencyReason
Few URLs (<50)5-10Fast without overloading
Many URLs (100-500)10-20Balance speed/resources
Very many URLs (>500)20-30Maximum speed

Warning: Values too high can cause rate limiting even with proxies.

Timeout

The requestTimeoutSecs parameter defines how long to wait for each request.

Recommended values:

  • Default (15s): Suitable for most cases
  • 10s: If Borsa Italiana is fast and you want to speed up
  • 30s: If you receive many timeout errors

Error Handling

The actor saves all results in the dataset, including failed ones.

Error Types

Failed URLs contain the error field:

  • "Request failed": Network error or timeout
  • Other messages: Site-specific errors

How to handle errors

Filter only successes:

const successfulItems = dataset.items.filter(item => !item.error);

Filter only errors:

const failedItems = dataset.items.filter(item => item.error);
console.log(`Failed URLs: ${failedItems.length}`);

Rate Limits and Best Practices

Borsa Italiana Limits

Borsa Italiana can block requests that are too frequent. To avoid this:

  1. Use Apify Proxy (especially RESIDENTIAL)
  2. Reduce concurrency to 5-10 for large volumes
  3. Distribute requests over time (run the actor at different times)

Best Practices

For daily scraping:

  • Use residential proxies
  • Concurrency: 5-10
  • Run during low activity hours (evening/night)

For occasional scraping:

  • Proxies not needed
  • Concurrency: 5
  • Any time

For large datasets (>1000 URLs):

  • Split into multiple batches
  • Use residential proxies
  • Run batches on different time

Troubleshooting

"Input urls must be a non-empty array"

Problem: The urls field is empty or missing.

Solution: Make sure to pass at least one URL or ISIN in the array:

{
"urls": ["https://www.borsaitaliana.it/..."]
}

Or use ISIN codes:

{
"urls": ["IT0005239360", "IT0005565400"]
}

Many items with "error" field

Problem: Too many URLs or ISINs are failing.

Possible causes and solutions:

  1. Rate limiting: Enable proxies or reduce concurrency
  2. Timeout: Increase requestTimeoutSecs to 30
  3. Invalid URLs or ISINs: Verify that URLs are correct and ISINs are valid (12 characters: 2 letters + 10 alphanumeric)
  4. Network issues: Try again later

Note: Invalid ISIN format will be rejected with error: "Invalid entries detected. Each entry must be either: A URL starting with https://www.borsaitaliana.it or A valid ISIN code"

Missing fields in output

Problem: Some expected fields are not present in the output.

Cause: The actor automatically removes null fields to keep the output clean.

Explanation:

  • Different instrument types have different fields
  • Stocks have superSector, ETFs have benchmark, Funds have lastNav
  • Fields not present on the page are automatically excluded
  • This is expected behavior and helps reduce output size

Note: If critical fields like value or instrumentName are missing, verify the URL is correct and the instrument is actively traded.

Actor too slow

Solutions:

  1. Increase maxConcurrency to 10-20
  2. Reduce requestTimeoutSecs to 10
  3. Use datacenter proxies instead of residential (faster but less reliable)

Advanced Use Cases

Portfolio Tracking

Track multiple instruments and analyze performance:

// Example: Filter stocks with positive 1-year performance
const goodPerformers = dataset.items.filter(item =>
item.performance1Year > 10 && item.superSector === "Assicurazioni"
);

Data Analysis

Extract comprehensive market data:

// Example: Get all ETFs with low fees
const lowFeeETFs = dataset.items.filter(item =>
item.totalAnnualFees && item.totalAnnualFees < 0.3
);

Price Alerts

Monitor year high/low:

// Example: Find instruments near 52-week low
const nearLow = dataset.items.filter(item => {
const currentPrice = item.value;
const yearLow = item.yearLow;
return currentPrice && yearLow &&
(currentPrice - yearLow) / yearLow < 0.05; // Within 5% of low
});

Support

For issues or questions:

  1. Check this documentation
  2. Check the dataset for specific error messages
  3. Reduce concurrency and try again
  4. Verify that URLs are valid on Borsa Italiana

⚠️ Disclaimer

Important Notice:

  • Not Financial Advice: This tool is for informational purposes only. The data extracted should not be considered as financial advice, investment recommendation, or trading signal.
  • Data Accuracy: While the scraper extracts data directly from Borsa Italiana, we cannot guarantee the accuracy, completeness, or timeliness of the information. Always verify critical data from official sources.
  • Your Responsibility: You are solely responsible for how you use the extracted data. Any investment decisions made based on this data are at your own risk.
  • Terms of Service: Ensure your use complies with Borsa Italiana's terms of service and applicable laws. Use responsibly and avoid excessive requests that could impact the website's performance.
  • No Warranty: This software is provided "as is" without any warranty of any kind, express or implied.
  • Rate Limits: Respect rate limits and use proxies when scraping large volumes to avoid being blocked.

By using this actor, you acknowledge and accept these terms.