Registro Imprese APIregistroimprese.it ↗
Search and retrieve official Italian company data from Registro Imprese. Access VAT numbers, legal form, REA numbers, addresses, and PEC email via 2 endpoints.
What is the Registro Imprese API?
The Registro Imprese API provides structured access to Italy's official business registry through 2 endpoints. Use search_companies to find companies by name and filter by province, then pass the returned company_id to get_company_details to retrieve verified fields including VAT number, fiscal code, REA number, registered address, legal form, and certified email (PEC).
curl -X GET 'https://api.parse.bot/scraper/084917d9-3f65-4303-bdbd-736a43473dea/search_companies' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace registroimprese-it-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
"""
Italian Business Registry API (Registro Imprese) - Parse Client
Search and extract official company data from the Italian Business Registry.
Get your API key from: https://parse.bot/settings
"""
import os
import json
import requests
from typing import Optional, Any, Dict, List
class ParseClient:
"""Client for the Italian Business Registry API via Parse."""
def __init__(self, api_key: Optional[str] = None):
"""
Initialize the Parse API client.
Args:
api_key: API key for Parse. If not provided, reads from PARSE_API_KEY env var.
"""
self.base_url = "https://api.parse.bot"
self.scraper_id = "718193c2-9b35-4cca-a2a7-60c1e7c12f98"
self.api_key = api_key or os.getenv("PARSE_API_KEY")
if not self.api_key:
raise ValueError("API key not provided. Set PARSE_API_KEY environment variable or pass api_key parameter.")
def _call(self, endpoint: str, method: str = "POST", **params) -> Dict[str, Any]:
"""
Make a request to the Parse API.
Args:
endpoint: The API endpoint name
method: HTTP method (GET or POST)
**params: Parameters to send with the request
Returns:
Response JSON as a dictionary
"""
url = f"{self.base_url}/scraper/{self.scraper_id}/{endpoint}"
headers = {
"X-API-Key": self.api_key,
"Content-Type": "application/json"
}
if method == "GET":
response = requests.get(url, headers=headers, params=params)
elif method == "POST":
response = requests.post(url, headers=headers, json=params)
else:
raise ValueError(f"Unsupported HTTP method: {method}")
response.raise_for_status()
return response.json()
def search_companies(self, query: str, province: Optional[str] = None) -> Dict[str, Any]:
"""
Search for Italian companies by name and province.
Args:
query: Company name or keyword to search for
province: Two-letter province code (e.g., 'VI' for Vicenza), optional
Returns:
Dictionary with total count and items list containing company info
"""
params = {"query": query}
if province:
params["province"] = province
return self._call("search_companies", method="GET", **params)
def get_company_details(self, p_auth: str, instance_id: str, company_id: str) -> Dict[str, Any]:
"""
Get full details for a specific company.
Args:
p_auth: Session auth token from search results
instance_id: Portlet instance ID from search results
company_id: Encrypted company ID from search results
Returns:
Dictionary with complete company details
"""
params = {
"p_auth": p_auth,
"instance_id": instance_id,
"company_id": company_id
}
return self._call("get_company_details", method="GET", **params)
def main():
"""Practical workflow example: search companies and get their details."""
# Initialize the client
client = ParseClient()
print("=" * 60)
print("Italian Business Registry API - Company Search")
print("=" * 60)
# Search for companies
search_query = "ARROWELD"
province_code = "VI" # Vicenza
print(f"\nSearching for companies: '{search_query}' in province {province_code}...")
search_results = client.search_companies(query=search_query, province=province_code)
print(f"\nFound {search_results['total']} company/companies:")
print("-" * 60)
# Get p_auth token for use in subsequent calls
p_auth = search_results.get('p_auth')
# Process each company found
for idx, company in enumerate(search_results.get('items', []), 1):
print(f"\nResult {idx}: {company['name']}")
print(f" Location: {company['municipality']}, {company['province']}")
print(f" Address: {company['address']}")
print(f" Instance ID: {company['instance_id']}")
# Get detailed information for this company
print("\n Fetching detailed information...")
try:
details = client.get_company_details(
p_auth=p_auth,
instance_id=company['instance_id'],
company_id=company['company_id']
)
print(f" Full Details:")
print(f" Legal Form: {details.get('legal_form', 'N/A')}")
print(f" VAT Number: {details.get('vat_number', 'N/A')}")
print(f" Fiscal Code: {details.get('fiscal_code', 'N/A')}")
print(f" REA Number: {details.get('rea_number', 'N/A')}")
print(f" Full Address: {details.get('address', 'N/A')}")
print(f" PEC Email: {details.get('pec', 'N/A')}")
except requests.exceptions.RequestException as e:
print(f" Error fetching details: {e}")
print("\n" + "=" * 60)
print("Search completed successfully!")
print("=" * 60)
if __name__ == "__main__":
main()Search for Italian companies by name and province. returns basic info and a company_id for details.
| Param | Type | Description |
|---|---|---|
| queryrequired | string | Company name or keyword to search for. |
| province | string | Two-letter province code (e.g. VI for Vicenza) or empty for all. |
{
"type": "object",
"fields": {
"items": "array",
"total": "integer",
"p_auth": "string"
},
"sample": {
"items": [
{
"name": "ARROWELD ITALIA S.P.A.",
"address": "VIA GIOVANNI PASCOLI 5",
"province": "VI",
"company_id": "nNcW12/el7tWYr0/wb7VQw==",
"instance_id": "o6uJEv91oybn",
"municipality": "ZANE'"
}
],
"total": 1,
"p_auth": "IIWDr120"
}
}About the Registro Imprese API
What the API Returns
The API covers official registration data held by the Italian Business Registry (Registro Imprese), the authoritative public source for Italian company information. Responses include fields used in legal, compliance, and due-diligence contexts: vat_number, fiscal_code, rea_number, legal_form, address, name, and pec (the certified email address required for formal communications with Italian businesses).
Endpoints
search_companies accepts a query string (company name or keyword) and an optional province parameter using the standard two-letter Italian province code (e.g. MI for Milan, RM for Rome). It returns an array of matching companies, a total count, and a p_auth session token needed for the next call. get_company_details takes three parameters sourced directly from search results — company_id, p_auth, and instance_id — and returns the full company profile.
Workflow and Parameters
Because get_company_details depends on p_auth, company_id, and instance_id from search_companies, the two endpoints are designed to be used in sequence. You cannot call get_company_details with a standalone company identifier; you must first run a search to obtain all three required parameters. The province filter in search is optional — omitting it searches across all Italian provinces.
Coverage
Data reflects what is publicly filed with the Italian Chamber of Commerce system. This includes legally registered entities such as limited liability companies (SRL), joint-stock companies (SPA), sole proprietorships, and other recognized Italian legal forms. The legal_form field in the detail response identifies the exact entity type.
The Registro Imprese API is a managed, monitored endpoint for registroimprese.it — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when registroimprese.it changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official registroimprese.it API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Verify a supplier's VAT number and fiscal code before onboarding them as a vendor
- Look up the certified PEC email address to send legally valid communications to an Italian company
- Build a CRM enrichment pipeline that appends REA numbers and registered addresses to Italian business contacts
- Screen Italian counterparties by legal form before entering contracts
- Filter company searches by province to generate regional business lists for territory-based sales teams
- Automate due-diligence checks on Italian entities by retrieving their official registration details programmatically
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 100 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
One credit = one API call regardless of which marketplace API you call. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does Registro Imprese have an official developer API?+
What does get_company_details return beyond what search_companies shows?+
search_companies returns a list of matched companies with identifiers needed for follow-up calls. get_company_details returns the full profile: name, address, legal_form, rea_number, vat_number, fiscal_code, and pec. The search step exists to obtain the company_id, p_auth, and instance_id parameters that get_company_details requires.Can I search by VAT number or fiscal code directly instead of by company name?+
search_companies endpoint accepts a company name or keyword via the query parameter. Direct lookup by VAT number or fiscal code is not currently supported. You can fork this API on Parse and revise it to add a lookup-by-tax-identifier endpoint.