
Congress Stock Trades Scraper
scrape.ly/store/querystone/congress-trades-scraperNewsBusiness
3 monthly users

Track CMA CGM containers, bills of lading and bookings in bulk: route, ports, ETA, vessel and voyage, and the full container move history. No login needed.
Track CMA CGM shipments in bulk. Paste container numbers, bills of lading or booking numbers and get one clean row per shipment: status, route, ETA, vessel and voyage, plus every container move with its date, place and terminal. No login, no API key, and numbers CMA CGM doesn't know are free.
tracking_number + events record in the familiar track-and-trace event shape (eventType, eventClassifierCode, eventDateTime, transportCall).eta between runs and flag delays, rolled cargo or changed vessels.emptyReturnDate and the "Container to consignee" and empty-return moves.| Field | What it does |
|---|---|
trackingNumbers | Container numbers (e.g. CMAU4675590), bills of lading (e.g. LHV2981252) or booking numbers. Spaces and dashes are ignored, duplicates are tracked once, cma-cgm.com tracking links work too. |
trackingType | auto (default), container, billOfLading or booking. |
maxItems | Track only the first N numbers. Empty or 0 tracks all of them. |
shipmentStatus | any, inTransit (not arrived yet) or arrived (arrived at the port of discharge or delivered). |
eventsSince | Keep only moves on or after a date (2026-10-01) or a period (30 days). |
maxEventsPerContainer | Keep only the latest N moves per container. |
includePlannedEvents | Also list the planned vessel calls (default on). |
includeNotFound | Add a free found: false row for each number CMA CGM doesn't know. |
{
"trackingNumbers": ["CMAU4675590", "TCNU6131868", "LHV2981252"],
"trackingType": "auto",
"shipmentStatus": "any"
}
One row per tracked number.
| Field | Description |
|---|---|
trackingNumber, trackingType | The number you tracked and how it was found (container, billOfLading, booking) |
status | Before departure, In transit, Arrived at port of discharge or Delivered |
containerNumber, containerNumbers, containerCount | The container(s) behind the number |
sizeType, containerType | ISO code (e.g. 45G1) and type (e.g. 40HC) |
portOfLoading, portOfDischarge (+ Country, Code) | Route with UN/LOCODEs |
departureDate, arrivalDate, eta | Actual departure, actual arrival and estimated arrival at the port of discharge (local times) |
transshipmentPorts | Ports where the container changed vessel |
vessel, vesselImo, voyage | Vessel and voyage of the latest vessel move |
latestEvent, latestEventDate, latestEventLocation, latestEventTerminal | Latest actual move |
nextEvent, nextEventDate, nextEventLocation | Next planned move |
emptyReturnDate | Empty return deadline, when CMA CGM shows one |
containers | Per-container summary when a bill of lading or booking has several containers |
moves | Every move, oldest first: date, code, description, location, terminal, vessel, voyage, phase (Export, Transshipment, Import) |
tracking_number, events | The same moves as track-and-trace events, newest first |
trackingUrl, trackedAt | Link to the CMA CGM page and the time of tracking |
Example (from a real run, shortened):
{
"trackingNumber": "TCNU6131868",
"trackingType": "container",
"status": "In transit",
"containerNumber": "TCNU6131868",
"sizeType": "45G1",
"containerType": "40HC",
"portOfLoading": "YANTIAN",
"portOfLoadingCode": "CNYTN",
"portOfDischarge": "ROTTERDAM",
"portOfDischargeCode": "NLRTM",
"departureDate": "2026-10-02T06:54:00",
"eta": "2026-10-29T11:00:00",
"vessel": "CMA CGM CALLISTO",
"vesselImo": "9410753",
"voyage": "0R11EW1MA",
"latestEvent": "Vessel departure",
"latestEventDate": "2026-10-02T06:54:00",
"latestEventLocation": "YANTIAN",
"nextEvent": "Vessel arrival (planned)",
"nextEventDate": "2026-10-29T11:00:00",
"nextEventLocation": "ROTTERDAM",
"moves": [
{
"date": "2026-09-24T01:17:00",
"code": "MOS",
"description": "Empty to shipper",
"location": "YANTIAN",
"locationCode": "CNYTN",
"terminal": "YANTIAN INTERNATIONAL CONT TERMINAL",
"transportMode": "TRUCK",
"phase": "Export",
"state": "done"
}
],
"trackingUrl": "https://www.cma-cgm.com/ebusiness/tracking/search?SearchBy=Container&Reference=TCNU6131868",
"tracking_number": "TCNU6131868",
"events": [
{
"eventType": "TRANSPORT",
"eventClassifierCode": "PLN",
"eventDateTime": "2026-10-29T11:00:00",
"transportEventTypeCode": "ARRI",
"carrierSpecificData": {"internalEventCode": "PVA", "internalEventLabel": "Vessel arrival (planned)", "transportationPhase": "Import"},
"transportCall": {
"UNLocationCode": "NLRTM",
"modeOfTransport": "VESSEL",
"location": {"locationName": "ROTTERDAM", "facilityName": "ROTTERDAM WORLD GATEWAY TERMINAL"},
"vessel": {"vesselIMONumber": "9410753", "vesselName": "CMA CGM CALLISTO"},
"carrierVoyageNumber": "0R11FE1MA"
}
}
]
}
The Container moves view of the dataset lists one row per move.
Is it legal to track CMA CGM shipments this way? The actor reads the public tracking page that anyone can open without an account. Track shipments you have a business reason to follow and respect CMA CGM's terms. This actor is independent and not affiliated with CMA CGM.
Do I need a login, an API key or my own proxy? No. The default proxy setting (datacenter exits) works with cma-cgm.com, and the actor clears the site's visitor check on its own. If the exits keep failing, the run switches to residential exits in France by itself. Proxy traffic is part of the platform usage above.
How many numbers can I track at once? As many as you like; there is no cap per run. In our tests 1,500 numbers finished in about two minutes.
Which numbers work? Container numbers (4 letters + 7 digits), CMA CGM bills of lading and booking numbers. Containers of other CMA CGM group lines show up when CMA CGM tracks them.
Why is a field empty?
CMA CGM doesn't show every detail for every shipment: arrivalDate stays empty until the vessel arrives, nextEvent is empty once nothing more is planned, and emptyReturnDate only appears for some imports. Times are local times as CMA CGM shows them, without a time-zone offset.
Can I schedule it or use the API? Yes. Schedule a daily run, call it from the API, or chain it with webhooks and integrations.
Every field below can be set in the run form, passed through the API, or saved as a task. Unset fields fall back to the defaults shown.
trackingNumbersarrayOptionalTracking numbers
CMA CGM container numbers (e.g. CMAU4675590), bill of lading numbers (e.g. LHV2981252) or booking numbers, one per line. Spaces and dashes are ignored, duplicates are tracked once, and pasted cma-cgm.com tracking links work too.
trackingTypeenumOptionaldefault "auto"Number type
Leave on Auto-detect: container numbers (4 letters + 7 digits) are recognised by their format, other numbers are tried as a bill of lading first and then as a booking. Pick a type to skip the detection.
maxItemsintegerOptionalMax results
Track at most this many numbers from the list (in list order). Leave empty (or 0) to track every number. Each shipment found is one result.
shipmentStatusenumOptionaldefault "any"Shipment status
Keep only shipments that are still on their way, or only those that already arrived at the port of discharge (or were delivered). Shipments that don't match are skipped and not charged.
eventsSincestringOptionalEvents since
Keep only container moves on or after this date (YYYY-MM-DD, or a period like '30 days'). The shipment summary fields still use the full history.
maxEventsPerContainerintegerOptionaldefault 0Max events per container
Keep only the latest N moves of each container. 0 keeps the full history.
includePlannedEventsbooleanOptionaldefault trueInclude planned moves
Also list the moves CMA CGM still expects (planned vessel departures and arrivals with their dates). The next planned move is always shown in the summary fields.
includeNotFoundbooleanOptionaldefault falseAdd rows for numbers CMA CGM doesn't know
Add a free row (found: false) for every number CMA CGM has no shipment for. These rows are never charged.
proxyConfigurationobjectOptionaldefault {"useScrapelyProxy":true,"scrapelyProxyGroups":["DATACENTER…Proxy configuration
Datacenter exits are the default and the cheapest: cma-cgm.com checks every new visitor and the actor clears that check on its own. Each tracked number uses about 35 KB of traffic. If the chosen exits keep failing, the run switches to residential exits in France by itself.
Every run writes its results to a dataset. Preview it in the dashboard, then export it or read it through the API.
| Field | Type | Description |
|---|---|---|
| trackingNumber | string | null | The number you tracked |
| trackingType | string | null | How the number was found: container, billOfLading or booking |
| found | boolean | null | True for every shipment row; false only on the optional free rows for unknown numbers |
| status | string | null | Before departure, In transit, Arrived at port of discharge, Delivered (Mixed when the containers of a bill of lading differ) |
| containerCount | number | null | Number of containers behind the number |
| containerNumbers | array | null | Containers behind the number |
| containerNumber | string | null | Container number (the first one for a multi-container bill of lading) |
| sizeType | string | null | ISO size and type code, e.g. 45G1 |
| containerType | string | null | Container type, e.g. 40HC |
| portOfLoading | string | null | Port of loading |
| portOfLoadingCountry | string | null | Country code of the port of loading |
| portOfLoadingCode | string | null | UN/LOCODE of the port of loading |
| portOfDischarge | string | null | Port of discharge |
| portOfDischargeCountry | string | null | Country code of the port of discharge |
| portOfDischargeCode | string | null | UN/LOCODE of the port of discharge |
| departureDate | string | null | Actual vessel departure from the port of loading (local time) |
| arrivalDate | string | null | Actual vessel arrival at the port of discharge (local time) |
| eta | string | null | Estimated (or actual) arrival at the port of discharge (local time) |
| emptyReturnDate | string | null | Date by which the empty container should be returned, when shown |
| transshipmentPorts | array | null | Transshipment ports on the route |
| vessel | string | null | Vessel of the latest vessel move |
| vesselImo | string | null | IMO number of that vessel |
| voyage | string | null | Voyage reference of that vessel move |
| latestEvent | string | null | Latest actual container move, e.g. Vessel departure |
| latestEventDate | string | null | Date of the latest move (local time) |
| latestEventLocation | string | null | Place of the latest move |
| latestEventTerminal | string | null | Terminal or depot of the latest move |
| nextEvent | string | null | Next planned move, e.g. Vessel arrival (planned) |
| nextEventDate | string | null | Date of the next planned move (local time) |
| nextEventLocation | string | null | Place of the next planned move |
| containers | array | null | Per-container summary, filled only when a bill of lading or booking has several containers |
| moves | array | null | Every container move, oldest first: date, code, description, location, terminal, vessel, voyage, phase, state |
| trackingUrl | string | null | Tracking page on cma-cgm.com |
| trackedAt | string | null | When the number was tracked (UTC) |
| tracking_number | string | null | The number you tracked (reference field name) |
| events | array | null | The moves as track-and-trace events, newest first (eventType, eventClassifierCode, eventDateTime, transportCall, ...) |
| error | string | null | Why a number was not found (free rows only) |
You pay for the events the actor reports, such as each result or page it produces. Platform usage is included in the event prices.
| Event | Charged when | Price |
|---|---|---|
| Tracking result | One shipment found and saved for a tracked container, bill of lading or booking number (route, ETA, vessel and the full container move history). Numbers CMA CGM does not know are free. | $0.008 |
Run this actor from your own code. Swap in your API token and the examples work as-is.
import { ScrapelyClient } from 'scrapely-client'
const client = new ScrapelyClient({ token: process.env.SCRAPELY_TOKEN })
// Start the actor and wait for the run to finish.
const run = await client.actor('querystone/cma-cgm-tracking-scraper').call({
"trackingNumbers": [
"CMAU4675590",
"LHV2981252"
],
"proxyConfiguration": {
"useScrapelyProxy": true,
"scrapelyProxyGroups": [
"DATACENTER"
]
}
})
// Read the dataset the run produced.
const { items } = await client.dataset(run.defaultDatasetId).listItems()
console.log(items)Tokens live in your account settings. Keep them server-side: a token carries the full permissions of your account.
Connect the Scrape.ly MCP server once and your agent can run this actor as a tool. Pick your tool:
Fetch scrape.ly/agents.md and run querystone/cma-cgm-tracking-scraperPaste into Claude Code, Codex, Cursor or any AI agent. It signs you in once in the browser.
{
"mcpServers": {
"scrapely": {
"url": "https://api.scrape.ly/mcp?tools=actors,runs,storage,docs&actors=querystone/cma-cgm-tracking-scraper"
}
}
}No key in the file: your client opens the browser to sign you in the first time it connects.
Inputs the developer prepared for common jobs. Open one to see its input, then copy it to your account to run it as-is or adjust it.
Six CMA CGM containers on their way, one typed with spaces and a dash, detected automatically.
Five CMA CGM bills of lading, two of them with several containers.
Two CMA CGM booking numbers.
Keep only shipments that reached the port of discharge, with the two latest moves per container.
Scrape.ly gives you the infrastructure, the tooling, and the team to extract, process, and operationalize web data at any scale. Setup takes minutes. The advantage lasts forever.