# FIATA Freight Forwarder Member Directory Scraper (`jungle_synthesizer/fiata-freight-forwarder-member-directory-scraper`) Actor

Scrapes the full FIATA member directory across all 153 country pages -- association and individual freight-forwarder members, with named responsible-person contacts and decoded e-mail addresses.

- **URL**: https://apify.com/jungle_synthesizer/fiata-freight-forwarder-member-directory-scraper.md
- **Developed by:** [BowTiedRaccoon](https://apify.com/jungle_synthesizer) (community)
- **Categories:** Lead generation, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.80 / 1,000 record scrapeds

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

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

## FIATA Freight Forwarder Member Directory Scraper

Extract every member of **FIATA** (the International Federation of Freight Forwarders
Associations) across all 153 country pages in its public member directory — association
members and individual-member freight forwarders alike, each with a named contact, decoded
e-mail address, phone, fax, website, and postal address.

### What does this actor do?

- Enumerates all 153 country pages in the FIATA member directory and extracts every member firm listed on each one
- Covers both FIATA membership classes: **Association Members** (national freight-forwarder associations) and **Individual Members** (individual freight-forwarding companies)
- Returns the **named, titled contact** at each firm (e.g. "Director General", "President", "Manager") where the directory publishes one — a decision-maker, not a switchboard number
- Decodes e-mail addresses that the source page hides behind a placeholder, so the `email` field contains a real, usable address rather than a dead string
- Filter by member class to pull only association contacts or only individual-company contacts

### What data does it extract?

| Field            | Description                                                                                                |
|------------------|------------------------------------------------------------------------------------------------------------|
| `company_name`   | Member firm or association name                                                                            |
| `member_class`   | `Association Members` or `Individual Members`                                                              |
| `country`        | Country name                                                                                               |
| `country_code`   | ISO-2 country code                                                                                         |
| `postal_address` | Postal address                                                                                             |
| `city`           | City, where the address format allows it to be parsed out                                                  |
| `postcode`       | Postal/ZIP code, where the address format allows it to be parsed out                                       |
| `email`          | Decoded contact e-mail address                                                                             |
| `phone`          | Telephone number                                                                                           |
| `fax`            | Fax number, where published                                                                                |
| `website`        | Firm website URL, where published                                                                          |
| `contacts`       | Named responsible person(s) at the firm, formatted as `"Name, Title"` (multiple entries separated by `; `) |
| `directory_url`  | FIATA directory page this record was read from                                                             |
| `scraped_at`     | ISO-8601 timestamp when the record was collected                                                           |

Not every firm publishes every field — a fax number or a named contact is common but not universal, and the directory itself leaves some fields blank for some members.

### How to use it

Leave the input at its defaults to pull a sample across the full directory. Raise `maxItems` for a larger run — the directory covers all 153 countries by default, so a high `maxItems` (or none at all, depending on your plan) returns the full membership list in one run.

| Field           | Type    | Default | Description                                                      |
|-----------------|---------|---------|------------------------------------------------------------------|
| `maxItems`      | integer | `10`    | Maximum number of member records to save                         |
| `memberClasses` | array   | both    | Restrict to `Association Members`, `Individual Members`, or both |

### Use cases

- **Freight-forwarding prospect lists** — Build a global contact list of freight forwarders, segmented by country, complete with a named decision-maker and a working e-mail address.
- **Trade and logistics market mapping** — Measure freight-forwarder association density and individual-member coverage by country for market-entry or competitive analysis.
- **Supply-chain vendor sourcing** — Identify FIATA-affiliated freight forwarders in a target country before issuing an RFP or vetting a logistics partner.
- **Association outreach** — Reach national freight-forwarder associations directly through their published leadership contact, rather than a generic info@ address.

### FAQ

**Does this include every FIATA member country?**
Yes, by default — the actor enumerates all 153 country pages the directory publishes. Use `maxItems` to cap the size of a single run, or `memberClasses` to narrow which member type you pull.

**What does `contacts` look like when a firm has more than one responsible person?**
Multiple contacts are joined in one string, separated by `; ` — for example `"Frank Huster, Director General; Axel Plass, President"`.

**Why are some fields empty on some records?**
The FIATA directory itself doesn't require every firm to publish every field — fax numbers and named contacts are common but not guaranteed. The actor returns exactly what the directory publishes for each firm.

Results are available for export in JSON, CSV, and Excel formats from the Apify dataset tab.

# Actor input Schema

## `sp_intended_usage` (type: `string`):

What will this data feed? E.g. lead lists, KYB checks, price tracking.

## `sp_improvement_suggestions` (type: `string`):

Provide any feedback or suggestions for improvements.

## `sp_contact` (type: `string`):

We'll personally help with your use case. No spam.

## `resumeCursor` (type: `string`):

Leave empty for a fresh crawl. To CONTINUE a previous run where it stopped — without paying again for records you already received — paste the `resumeCursor` value from that run's Output (the run's OUTPUT key). Resume promptly: the previous run's data expires with your account's retention window (free tier: your ~10 most recent runs).

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

Maximum number of member records to save. Leave default for a quick sample; raise it (or leave unset in the API) for a full run across all 153 countries.

## `memberClasses` (type: `array`):

Which FIATA member classes to include. Default: both.

## Actor input object example

```json
{
  "sp_contact": "Share your email here...",
  "maxItems": 10,
  "memberClasses": [
    "Association Members",
    "Individual Members"
  ]
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# 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 = {
    "sp_contact": "Share your email here...",
    "maxItems": 10,
    "memberClasses": [
        "Association Members",
        "Individual Members"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("jungle_synthesizer/fiata-freight-forwarder-member-directory-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 = {
    "sp_contact": "Share your email here...",
    "maxItems": 10,
    "memberClasses": [
        "Association Members",
        "Individual Members",
    ],
}

# Run the Actor and wait for it to finish
run = client.actor("jungle_synthesizer/fiata-freight-forwarder-member-directory-scraper").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 '{
  "sp_contact": "Share your email here...",
  "maxItems": 10,
  "memberClasses": [
    "Association Members",
    "Individual Members"
  ]
}' |
apify call jungle_synthesizer/fiata-freight-forwarder-member-directory-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,jungle_synthesizer/fiata-freight-forwarder-member-directory-scraper"
        }
    }
}
```

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/YRFatmZDuLyAwpyjQ/builds/DOh5JPUhXotYTa36P/openapi.json
