# Global Freight Rate Index Aggregator (`conceivable_extension/global-freight-rate-index-aggregator`) Actor

Aggregates real, free container/dry-bulk freight rate indices (Drewry WCI, Freightos Baltic Index incl. 12 trade lanes, Baltic Dry Index, Trading Economics) into one structured feed with weekly/monthly/yearly change tracking.

- **URL**: https://apify.com/conceivable\_extension/global-freight-rate-index-aggregator.md
- **Developed by:** [joseph fadero](https://apify.com/conceivable_extension) (community)
- **Categories:** Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.00 / 1,000 index snapshot returneds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#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

## Global Freight Rate Index Aggregator

**Know your duty cost, your freight cost, and your supplier's shipment pattern — in one workflow.** This actor is the third leg of a companion suite: run it alongside [Global Landed-Cost & Tariff-Change Monitor](../Global%20Landed-Cost%20%26%20Tariff-Change%20Monitor/) (Actor 26, your duty cost) and [Trade Flow & Supply-Chain Concentration Intelligence](../Import-Export%20Shipment-Manifest%20Intelligence/) (Actor 28, your supplier's shipment pattern) for the full import-cost picture. Container freight rates dropped over 70% from their 2022 peak but swing hard on single events (a Red Sea route reopening, a canal disruption) — this aggregates the free/directional layer of the real indices that track that volatility into one structured, scheduled feed, instead of checking four separate index sites by hand.

### Phase 1 source audit — what's actually free, verified live

The PRD flagged real uncertainty about paywalls before any code was written. Here's what direct testing found, source by source:

| Index | Free access confirmed | What's actually free | Basis |
|---|---|---|---|
| **Drewry World Container Index (WCI)** | ✅ Headline only | Composite $/40ft figure, in the page's own meta description | Confirmed live: real Login/Register prompts gate the "6,700 port pairs" route-level product the PRD flagged as paid; the headline composite is not behind that wall |
| **Freightos Baltic Index (FBX)** | ✅ Composite + all 12 public lanes | Every FBX0X trade-lane sub-index, from a single page request | Confirmed live — richer than expected. The PRD's own research called FBX "primarily subscription-based"; a clean embedded JS ticker object on the main terminal page has the composite AND all 12 lanes in static HTML, no JS execution or per-route page visits needed |
| **Baltic Dry Index (BDI)** | ⚠️ Via third-party republisher | Current composite value | The official Baltic Exchange source is subscription/member-only, confirmed live — no free real-time feed exists there. `balticdryindex.com`, a legitimate third-party site, republishes the current value in a clean, parseable meta description. Documented here as a third-party source, not the primary one — same honesty standard as Actor 29's EUR-Lex workaround |
| **Trading Economics "Containerized Freight Index"** | ✅ Composite | Current value, in an embedded JSON field | Confirmed live. **A real naming trap found and worth flagging**: Trading Economics' own `/commodity/world-container-index` URL 302-redirects to this same page — but this is Trading Economics' own proprietary Shanghai-origin composite, not a republish of Drewry's WCI. Confirmed by comparing values directly: Drewry's WCI was $4,297/40ft the same week this page showed 3,276.14 points — different units, different numbers, genuinely different indices despite the confusingly overlapping name. Never conflated in this actor's output. |

### A scope simplification, not an omission

The PRD's input schema included `routes` and `watchList` fields for selecting specific trade lanes. In practice, only FBX has meaningful route-level granularity (WCI, BDI, and the Trading Economics index are each a single composite figure) — and Freightos' own ticker returns **all 12 routes in one request** regardless of which you'd ask for, so there's no cost saved by letting a caller narrow the selection. This actor always returns every available route per selected index rather than requiring the caller to enumerate them — more complete, not less, than the PRD's original schema.

### Modes

| Mode | Behavior |
|---|---|
| `current_snapshot` | Fetch and return today's values only — no stored history touched |
| `monitor` | Same fetch, plus weekly/monthly/yearly % change computed from this actor's own stored run history (the default agent-facing pattern, per the portfolio's x402 design convention) |

On a brand-new deployment (or a new index/route never fetched before), `weeklyChangePercent`/`monthlyChangePercent`/`yearlyChangePercent` are honestly `null` until enough scheduled runs have accumulated real historical snapshots in that window — not fabricated from a single data point. The change-lookup uses a tolerance window around each target (±2 days for weekly, ±5 for monthly, ±15 for yearly) so it doesn't require a snapshot on the *exact* day, only a close one, which matters since these indices publish on different day-of-week cadences.

### Output schema

```json
{
  "indexName": "wci | fbx | bdi | containerized_freight_index",
  "route": "string (\"composite\" for WCI/BDI/TE; a named trade lane for FBX)",
  "currentValue": "number",
  "unit": "usd_per_40ft_container | points",
  "weeklyChangePercent": "number | null",
  "monthlyChangePercent": "number | null",
  "yearlyChangePercent": "number | null",
  "sourceUrl": "string",
  "checkedAt": "ISO timestamp",
  "status": "success | failed",
  "errorMessage": "string | null"
}
```

`unit` matters — don't compare a `points`-based index (BDI, Trading Economics) against a `usd_per_40ft_container` one (WCI, FBX) as if they were the same scale.

### Setup note

No browser needed — all four sources were confirmed live to work over plain HTTP with real data present in static HTML (no JS execution required for any of them), so this uses the lighter `apify/actor-node:20` base image rather than the portfolio's usual Playwright/Chrome default.

### Pricing

| Event | Price |
|---|---|
| Run started | £0.05 |
| Reading success | £0.06 |
| Fetch failed | free |

### n8n integration

- **Workflow A (trigger):** scheduled weekly run against your (or clients') relevant trade lanes.
- **Workflow B (processing):** alert on significant week-over-week moves (e.g. >10%) with historical context — lock in a rate now, or wait.

# Actor input Schema

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

current\_snapshot: fetch and return today's values for the selected indices (no history needed). monitor: same fetch, plus weekly/monthly/yearly % change computed from this actor's own stored run history — the default agent-facing pattern.

## `indices` (type: `array`):

Which indices to fetch. wci = Drewry World Container Index (composite only — route-level is paywalled). fbx = Freightos Baltic Index (composite + all 12 public trade lanes). bdi = Baltic Dry Index (via a legitimate free third-party republisher, since the official Baltic Exchange source is subscription-only). containerized\_freight\_index = Trading Economics' own index (a real, distinct index — not a Drewry WCI republish, despite the similar name).

## Actor input object example

```json
{
  "mode": "monitor",
  "indices": [
    "wci",
    "fbx",
    "bdi",
    "containerized_freight_index"
  ]
}
```

# Actor output Schema

## `resultsDatasetUrl` (type: `string`):

Aggregated container freight rate index values across major trade lanes, tracked for change since the prior run, produced by this run.

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("conceivable_extension/global-freight-rate-index-aggregator").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 = {}

# Run the Actor and wait for it to finish
run = client.actor("conceivable_extension/global-freight-rate-index-aggregator").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 '{}' |
apify call conceivable_extension/global-freight-rate-index-aggregator --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,conceivable_extension/global-freight-rate-index-aggregator"
        }
    }
}

```

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/fB5mfzB5GHn7TP4IC/builds/kuAExFEK5oMYrifQY/openapi.json
