# Info Lithuania Scraper (`crawlerbros/info-lt-scraper`) Actor

Scrape Lithuanian business listings from info.lt - search by keyword, browse the full category taxonomy, or fetch specific companies by URL. Get name, address, phone, website, categories, opening hours, gallery, and branch locations.

- **URL**: https://apify.com/crawlerbros/info-lt-scraper.md
- **Developed by:** [Crawler Bros](https://apify.com/crawlerbros) (community)
- **Categories:** Lead generation, Automation, Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Info Lithuania Scraper

Scrape **info.lt** — Lithuania's public business directory. Search by keyword, browse the full category taxonomy (300+ categories), or fetch specific companies by URL. Get name, address, phone, website, categories, opening hours, photo gallery, and branch locations. HTTP-only, no login and no proxy required.

### What this actor does

- **Three modes:** `search` (keyword), `byCategory` (taxonomy browse), `byUrls` (direct company lookup)
- **Full category taxonomy:** 300+ Lithuanian business categories and sub-categories in a searchable dropdown
- **City filter:** restrict results to any of Lithuania's 54 cities and municipalities
- **Rich company profiles:** address, phone, website, opening hours, description, photo gallery, other branch locations
- **Optional detail-page enrichment:** toggle off for faster listing-only runs
- **Empty fields are omitted** — no `null`, no placeholder text

### Output per company

- `companyId` — info.lt internal company ID
- `name` — company / business name
- `primaryCategory` — main business category
- `categories[]` — all listed business categories
- `fullAddress` — complete street address as shown on info.lt
- `city` — city or municipality parsed from the address
- `phone` — contact phone number
- `fax` — fax number (when different from phone)
- `website` — company website URL
- `description` — business description text
- `keywords[]` — SEO search terms associated with the listing (capped at 20)
- `openingHours[]` — `{ day, hours }` per weekday, when published
- `latitude`, `longitude` — map coordinates
- `logoUrl` — company logo image URL
- `photos[]` — photo gallery image URLs
- `branches[]` — other locations of the same business, `{ name, sourceUrl }`
- `sourceUrl` — canonical info.lt company page URL
- `recordType: "company"`, `scrapedAt`

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `mode` | string | `search` | `search` / `byCategory` / `byUrls` |
| `searchQuery` | string | `restoranas` | Free-text keyword (mode=search) |
| `category` | string | – | Category to browse, from the full taxonomy dropdown (mode=byCategory) |
| `customCategory` | string | – | Advanced override — paste a category URL or `slug/id` not in the dropdown (mode=byCategory) |
| `city` | string | – | Restrict to one of Lithuania's 54 cities/municipalities (search + byCategory) |
| `companyUrls` | array | – | Direct info.lt company page URLs to fetch (mode=byUrls) |
| `containsKeyword` | string | – | Keep only companies whose name, description, categories, or SEO keywords contain this text |
| `requireWebsite` | boolean | `false` | Only companies with a website |
| `requirePhone` | boolean | `false` | Only companies with a phone number |
| `requireEmailListed` | boolean | `false` | Only companies for which info.lt has an email address on file (search + byCategory) — uses info.lt's own server-side filter; the email itself is not extracted/output |
| `fetchDetails` | boolean | `true` | Visit each company's detail page for description, hours, gallery, branches |
| `maxItems` | int | `20` | Hard cap on companies returned (1–1000) |

#### Example: keyword search in a specific city

```json
{
  "mode": "search",
  "searchQuery": "automobilių remontas",
  "city": "Kaunas",
  "maxItems": 50
}
```

#### Example: browse a category nationwide

```json
{
  "mode": "byCategory",
  "category": "Baldai-prekyba/100209503",
  "maxItems": 100
}
```

#### Example: fast listing-only run (no detail-page enrichment)

```json
{
  "mode": "search",
  "searchQuery": "restoranas",
  "city": "Vilnius",
  "fetchDetails": false,
  "maxItems": 100
}
```

#### Example: fetch specific companies by URL

```json
{
  "mode": "byUrls",
  "companyUrls": [
    { "url": "https://www.info.lt/imones/Rejben-UAB/2383263" }
  ]
}
```

### Use cases

- **Lead generation** — build targeted prospect lists by category and city
- **Market research** — map business density and category coverage across Lithuania
- **Directory aggregation** — feed a comparison site or local-search product
- **Sales intelligence** — enrich CRM records with verified addresses, phones, and websites
- **Competitor mapping** — pull every listed business in a category to benchmark market coverage

### FAQ

**What is the data source?**
All data comes from the public pages of [info.lt](https://www.info.lt), a Lithuanian business directory. This actor is an independent third-party tool and is not affiliated with info.lt.

**Do I need to log in or provide an API key?**
No. All modes work against publicly accessible pages — no cookies, login, or API key required.

**Why is `email` not in the output?**
info.lt renders each listing's email address behind a client-side JavaScript reveal mechanism that isn't a simple, reliably-decodable encoding. To avoid shipping garbled or incorrect email addresses, this field is intentionally excluded. You can still filter on *whether* a company has an email on file using `requireEmailListed`, without the actual address being extracted.

**Why is there no "near me" / distance-based search?**
info.lt's distance search relies on the browser's geolocation permission with no URL parameter fallback, so it can't be driven by a server-side scraper. Use the `city` filter instead for location-based results.

**Is a company registration code (įmonės kodas) included?**
No — info.lt does not publish this on individual company listing pages; it's only used as an internal advanced-search filter, not as displayed data.

**How fresh is the data?**
Every run fetches live pages directly from info.lt at request time.

**What happens if a category or city has no matching results?**
The run finishes with 0 items and a status message explaining why — this is expected behavior, not an error.

**Can I combine `city` with `byUrls` mode?**
No — `byUrls` fetches exact company pages you specify, so location/category filters don't apply to that mode (though `containsKeyword`, `requireWebsite`, and `requirePhone` still do).

# Actor input Schema

## `mode` (type: `string`):

What to fetch: keyword search, category browse, or direct company URL fetch.

## `searchQuery` (type: `string`):

Free-text keyword to search for, e.g. company name, service, or product (mode=search). Example: `restoranas`, `automobilių remontas`, `baldai`.

## `category` (type: `string`):

Business category / sub-category to browse (mode=byCategory). Covers the full info.lt category taxonomy.

## `customCategory` (type: `string`):

Advanced override for `category` (mode=byCategory) — paste a category URL or `slug/id` pair directly (e.g. `Baldai-prekyba/100209503`) if you know the exact info.lt category not covered by the dropdown.

## `city` (type: `string`):

Restrict results to a specific Lithuanian city or municipality (applies to both `search` and `byCategory` modes). Leave empty for nationwide results.

## `companyUrls` (type: `array`):

Direct info.lt company page URLs to fetch (mode=byUrls), e.g. `https://www.info.lt/imones/Rejben-UAB/2383263`.

## `containsKeyword` (type: `string`):

Only keep companies whose name, description, or categories contain this text (case-insensitive). Applies to all modes.

## `requireWebsite` (type: `boolean`):

Only keep companies that have a website URL.

## `requirePhone` (type: `boolean`):

Only keep companies that have a phone number.

## `requireEmailListed` (type: `boolean`):

Only keep companies for which info.lt has an email address on file (uses info.lt's own "Turi el. paštą" server-side filter). Applies to `search` and `byCategory` modes. Note: the email address itself is not extracted/output — see the FAQ.

## `fetchDetails` (type: `boolean`):

Visit each company's detail page to collect description, opening hours, gallery, branches, and full category list. Disable for faster, listing-only runs (name, address, phone, website, primary categories only).

## `maxItems` (type: `integer`):

Maximum number of companies to return.

## Actor input object example

```json
{
  "mode": "search",
  "searchQuery": "restoranas",
  "city": "",
  "companyUrls": [
    {
      "url": "https://www.info.lt/imones/Rejben-UAB/2383263"
    }
  ],
  "requireWebsite": false,
  "requirePhone": false,
  "requireEmailListed": false,
  "fetchDetails": true,
  "maxItems": 20
}
```

# Actor output Schema

## `companies` (type: `string`):

Dataset containing all scraped info.lt business listings.

# 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 = {
    "mode": "search",
    "searchQuery": "restoranas",
    "companyUrls": [
        {
            "url": "https://www.info.lt/imones/Rejben-UAB/2383263"
        }
    ],
    "requireWebsite": false,
    "requirePhone": false,
    "requireEmailListed": false,
    "fetchDetails": true,
    "maxItems": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("crawlerbros/info-lt-scraper").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 = {
    "mode": "search",
    "searchQuery": "restoranas",
    "companyUrls": [{ "url": "https://www.info.lt/imones/Rejben-UAB/2383263" }],
    "requireWebsite": False,
    "requirePhone": False,
    "requireEmailListed": False,
    "fetchDetails": True,
    "maxItems": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("crawlerbros/info-lt-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "mode": "search",
  "searchQuery": "restoranas",
  "companyUrls": [
    {
      "url": "https://www.info.lt/imones/Rejben-UAB/2383263"
    }
  ],
  "requireWebsite": false,
  "requirePhone": false,
  "requireEmailListed": false,
  "fetchDetails": true,
  "maxItems": 20
}' |
apify call crawlerbros/info-lt-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=crawlerbros/info-lt-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/PNW47B6MdURXagg1Z/builds/0bTCmQCaZJw9jBUWr/openapi.json
