Borsa Italiana Scraper - Financial Data Extractor
Pricing
from $1.30 / 1,000 results
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
Actor stats
0
Bookmarked
3
Total users
2
Monthly active users
13 days ago
Last modified
Categories
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
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
urls | Array[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). |
lang | String | No | '' | Preferred language for all URLs. Options: '' (default/no override), 'it' (Italian), 'en' (English). If specified, appends/overrides ?lang= parameter to all URLs. |
useApifyProxy | Boolean | No | true | Enable Apify Proxy for requests |
proxyGroups | Array[String] | No | [] | Apify proxy groups (e.g., ["RESIDENTIAL"]) |
maxConcurrency | Integer | No | 5 | Maximum number of parallel requests |
requestTimeoutSecs | Integer | No | 15 | Timeout 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
- Go to Borsa Italiana
- Search for the instrument you're interested in (BTP, stock, bond, etc.)
- Go to the instrument detail page
- Copy the full URL from the address bar
Option 2: Use ISIN codes (simpler!)
- Find the ISIN code of the instrument (12 characters: 2 letters + 10 alphanumeric)
- Add it directly to the
urlsarray - ISINs are case-insensitive:
IT0005239360,it0005239360, orIt0005239360all 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=itto all URLs"en": Forces English - adds/overrides?lang=ento 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)
| Field | Type | Description | Example |
|---|---|---|---|
url | String | Instrument URL | "https://www.borsaitaliana.it/..." |
instrumentName | String | Instrument name | "Generali" |
isin | String | ISIN code | "IT0000062072" |
instrumentId | String | Internal instrument ID | "123456" |
alphanumericCode | String | Trading code | "G" |
💰 Price Data
| Field | Type | Description | Example |
|---|---|---|---|
value | Number | Current price (parsed) | 34.82 |
valueString | String | Current price (original format) | "34,82" |
percValue | Number | Percentage change (parsed) | -0.74 |
percValueString | String | Percentage change (original) | "-0,74%" |
open | Number | Opening price | 35.09 |
openString | String | Opening price (original) | "35,09" |
dayHigh | Number | Daily high | 35.20 |
dayHighString | String | Daily high (original) | "35,20" |
dayLow | Number | Daily low | 34.80 |
dayLowString | String | Daily low (original) | "34,80" |
📈 Performance Metrics
| Field | Type | Description | Example |
|---|---|---|---|
performance1Month | Number | 1-month performance | 2.29 |
performance1MonthString | String | 1-month performance (original) | "+2,29%" |
performance6Months | Number | 6-month performance | 13.87 |
performance6MonthsString | String | 6-month performance (original) | "+13,87%" |
performance1Year | Number | 1-year performance | 23.39 |
performance1YearString | String | 1-year performance (original) | "+23,39%" |
performanceYTD | Number | Year-to-date performance | 5.21 |
performanceYTDString | String | Year-to-date (original) | "+5,21%" |
yearHigh | Number | 52-week high price | 36.40 |
yearHighString | String | 52-week high (original) | "36,40" |
yearHighDate | String | Date of 52-week high | "06/01/26" |
yearLow | Number | 52-week low price | 34.94 |
yearLowString | String | 52-week low (original) | "34,94" |
yearLowDate | String | Date of 52-week low | "08/01/26" |
📊 Trading Data
| Field | Type | Description | Example |
|---|---|---|---|
lastTradeTime | String | Last transaction time | "17:38:18" |
referenceDate | String | Reference date | "08/01/2026" |
volumeTotal | Number | Total volume | 2680000 |
volumeTotalString | String | Total volume (original) | "2.680.000" |
volumeLast | Number | Last transaction volume | 20000 |
volumeLastString | String | Last volume (original) | "20.000" |
numberOfTrades | Number | Number of trades | 4916 |
numberOfTradesString | String | Number of trades (original) | "4.916" |
turnover | Number | Turnover value | 1890.60 |
turnoverString | String | Turnover (original) | "1.890,60" |
🏢 Stock-Specific Fields
| Field | Type | Description | Example |
|---|---|---|---|
superSector | String | Industry sector | "Assicurazioni" |
📦 ETF-Specific Fields
| Field | Type | Description | Example |
|---|---|---|---|
benchmark | String | Reference index | "FTSE MTS MP HRM-W AM" |
benchmarkStyle | String | Benchmark style | "Obbligazionario" |
benchmarkArea | String | Benchmark area | "GOVERNMENT BONDS - EUR" |
totalAnnualFees | Number | Annual fees percentage | 0.165 |
totalAnnualFeesString | String | Annual fees (original) | "0.165%" |
dividendsPolicy | String | Dividend policy | "CAPITALIZED" |
segment | String | ETF segment | "ETF Indicizzati" |
💼 Fund-Specific Fields
| Field | Type | Description | Example |
|---|---|---|---|
fundManager | String | Fund management company | "Amundi" |
lastNav | Number | Last NAV | 111.41 |
lastNavString | String | Last NAV (original) | "111,41" |
lastNavDate | String | Last NAV date | "08/01/26" |
🏦 Bond-Specific Fields
| Field | Type | Description | Example |
|---|---|---|---|
issuer | String | Bond issuer | "Governo Italiano" |
guarantor | String | Guarantor | "MEF" |
seniority | String | Subordination level | "Senior" |
couponFrequency | String | Coupon frequency | "Semestrale" |
periodicCouponRate | Number | Periodic coupon rate | 2.5 |
annualCouponRate | Number | Annual coupon rate | 5.0 |
grossYieldToMaturity | Number | Gross yield to maturity | 3.8 |
netYieldToMaturity | Number | Net yield to maturity | 3.3 |
expiryDate | String | Maturity date | "01/10/2028" |
🏪 Market Information
| Field | Type | Description | Example |
|---|---|---|---|
market | String | Trading market | "MTA" |
lotSize | Number | Minimum lot size | 1 |
negotiationCurrency | String | Trading currency | "EUR" |
tradingType | String | Trading type | "Continua" |
⚠️ Error Handling
| Field | Type | Description | Example |
|---|---|---|---|
error | String | Error message (only if failed) | "Request failed" |
Note:
- Each numeric field has both a
Numberversion (for calculations) and aStringversion (original format) - Only fields with actual data are included in the output
- Different instrument types have different fields (e.g., stocks have
superSector, ETFs havebenchmark)
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:
| Scenario | Concurrency | Reason |
|---|---|---|
| Few URLs (<50) | 5-10 | Fast without overloading |
| Many URLs (100-500) | 10-20 | Balance speed/resources |
| Very many URLs (>500) | 20-30 | Maximum 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:
- Use Apify Proxy (especially RESIDENTIAL)
- Reduce concurrency to 5-10 for large volumes
- 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:
- Rate limiting: Enable proxies or reduce concurrency
- Timeout: Increase
requestTimeoutSecsto 30 - Invalid URLs or ISINs: Verify that URLs are correct and ISINs are valid (12 characters: 2 letters + 10 alphanumeric)
- 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 havebenchmark, Funds havelastNav - 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:
- Increase
maxConcurrencyto 10-20 - Reduce
requestTimeoutSecsto 10 - 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 performanceconst goodPerformers = dataset.items.filter(item =>item.performance1Year > 10 && item.superSector === "Assicurazioni");
Data Analysis
Extract comprehensive market data:
// Example: Get all ETFs with low feesconst lowFeeETFs = dataset.items.filter(item =>item.totalAnnualFees && item.totalAnnualFees < 0.3);
Price Alerts
Monitor year high/low:
// Example: Find instruments near 52-week lowconst 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:
- Check this documentation
- Check the dataset for specific error messages
- Reduce concurrency and try again
- 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.