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

Track MSC containers, bills of lading and bookings in bulk: route, ports, ETA, vessel and voyage, and the full container event history. No login needed.
Track MSC shipments in bulk by container number, bill of lading or booking number and get clean, structured data back: route, ports, ETA, vessel and voyage, and the full event history of every container. Paste your numbers, press Start, and each shipment comes back in about a second. No MSC account, no login, and you pay only for shipments that were found.
tracking_number, tracking_type, bill_of_ladings) is included by default.| Field | What it does |
|---|---|
trackingNumbers | Container, bill of lading or booking numbers, one per line |
trackingType | auto (default), container, billOfLading or booking |
maxItems | Track at most this many numbers from the list (empty = all) |
shipmentStatus | any (default), inTransit or delivered |
eventsSince | Keep only container events on or after this date (2026-01-31 or 30 days) |
maxEventsPerContainer | Keep only the latest N events of each container (0 = all) |
includeRawData | Add the original MSC record (default on) |
includeNotFound | Add a free row for each number MSC doesn't know (default off) |
{
"trackingNumbers": ["MSCU0203658", "MEDUEZ472303"],
"trackingType": "auto",
"shipmentStatus": "any"
}
One row per tracked number. The Shipments view shows the summary; the Containers view lists every container on its own row.
| Field | Description |
|---|---|
trackingNumber, trackingType | The number you tracked and its type (Container, Bill of Lading, Booking) |
status, delivered | Booked (no container move yet), In transit or Delivered |
billOfLadingNumbers, containerNumbers, containerCount | Documents and containers on the shipment |
shippedFrom, shippedTo, portOfLoad, portOfDischarge, transshipments | The route |
finalPodEta | Estimated arrival at the port of discharge |
latestEventDate, latestEventDescription, latestEventLocation | The most recent actual container event |
nextEventDate, nextEventDescription, nextEventLocation | The next planned event, such as the estimated departure or arrival |
latestVesselName, latestVoyage, latestVesselImo | The vessel of the most recent vessel event |
containers[] | Per container: type, delivered flag, latest move, ETA and every event with date, location, UN/LOCODE, description, laden/empty, an estimated flag for planned moves, vessel, voyage, IMO, flag, terminal and the planned intermediate port calls |
tracking_number, tracking_type, bill_of_ladings | The original MSC record (when includeRawData is on) |
Example (shortened, from a real run):
{
"trackingNumber": "MSDU7979117",
"trackingType": "Container",
"status": "In transit",
"delivered": false,
"billOfLadingNumbers": [
"MEDUACD80319"
],
"containerNumbers": [
"MSDU7979117"
],
"containerCount": 1,
"shippedFrom": "TIANJINXINGANG, CN",
"shippedTo": "SANTOS, BR",
"portOfLoad": "TIANJINXINGANG, CN",
"portOfDischarge": "SANTOS, BR",
"transshipments": [
"NINGBO, CN"
],
"finalPodEta": "2026-10-27",
"priceCalculationDate": "2026-08-17",
"latestEventDate": "2026-09-20",
"latestEventDescription": "Full Transshipment Loaded",
"latestEventLocation": "NINGBO, CN",
"nextEventDate": "2026-10-27",
"nextEventDescription": "Estimated Time of Arrival",
"nextEventLocation": "SANTOS, BR",
"latestVesselName": "CONTI CONQUEST",
"latestVoyage": "QI636A",
"latestVesselImo": "9293818",
"containers": [
{
"containerNumber": "MSDU7979117",
"containerType": "40' HIGH CUBE",
"billOfLadingNumber": "MEDUACD80319",
"delivered": false,
"latestMove": "NINGBO, CN",
"podEtaDate": "2026-10-27",
"eventCount": 6,
"events": [
{
"order": 5,
"date": "2026-10-27",
"location": "SANTOS, BR",
"unLocode": "BRSSZ",
"description": "Estimated Time of Arrival",
"cargoStatus": null,
"vesselName": "CONTI CONQUEST",
"voyage": "QI636A",
"vesselImo": "9293818",
"vesselFlag": "LIBERIA",
"vesselBuilt": "2006",
"terminalName": "SANTOS BRASIL TERMINAL",
"terminalSmdg": "SSA",
"terminalBic": null,
"detail": [
"CONTI CONQUEST",
"QI636A"
],
"estimated": true,
"intermediaryPortCalls": [
{
"port": "RIO DE JANEIRO",
"country": "BR",
"eta": "2026-10-23T14:30",
"etd": "2026-10-24T19:30"
}
]
}
]
}
],
"trackingUrl": "https://www.msc.com/en/track-a-shipment?trackingNumber=MSDU7979117",
"trackedAt": "2026-10-21T11:37:43Z"
}
You pay $8 per 1,000 shipments found ($0.008 per tracked number that returns a shipment), plus the small platform usage of the run. There is no start fee. Numbers MSC doesn't know, invalid entries and shipments removed by the status filter are free.
Example: tracking 1,000 containers that all exist costs about $8 in results; platform usage (compute and residential proxy traffic) adds well under one cent per 100 numbers, because the scraper uses lightweight HTTP requests and 256 MB of memory.
Is it legal to scrape MSC tracking? The scraper reads the same public tracking information anyone sees on msc.com without logging in. It collects no personal data. Check that your use complies with MSC's terms and your local laws.
Do I need an MSC account, login or proxy? No account or login is used. The run uses residential proxy exits by default, because MSC refuses about a quarter of datacenter requests. A tracked number uses only a few kilobytes of proxy traffic.
How many numbers can I track in one run? There is no fixed limit. Use Max results to cap a run.
What if a field is empty? MSC doesn't publish every field for every shipment. For example, the ETA disappears once a container is delivered, and some in-transit containers show no bill of lading number. Empty fields come back as null.
Which number should I use? Any of them. A bill of lading or booking number returns every container on that shipment in one row; a container number returns that container.
Can I schedule it or use the API? Yes. Schedule the actor (for example daily) to monitor open shipments, or start runs and read datasets over the API from your own system.
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
MSC container numbers (e.g. MSCU0203658), bill of lading numbers (e.g. MEDUEZ472303) or booking numbers, one per line. Spaces and dashes are ignored, duplicates are tracked once, and pasted msc.com tracking links work too.
trackingTypeenumOptionaldefault "auto"Number type
Leave on Auto-detect: container numbers 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 moving or only those already delivered. Shipments that don't match are skipped and not charged.
eventsSincestringOptionalEvents since
Keep only container events 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 events of each container. 0 keeps the full history.
includeRawDatabooleanOptionaldefault trueInclude the original MSC record
Also add tracking_number, tracking_type and bill_of_ladings exactly as msc.com returns them (handy if you already parse that shape). Turn off for smaller rows.
includeNotFoundbooleanOptionaldefault falseAdd rows for numbers MSC doesn't know
Add a free row (found: false, with MSC's message) for every number MSC has no shipment for. These rows are never charged.
proxyConfigurationobjectOptionaldefault {"useScrapelyProxy":true,"scrapelyProxyGroups":["RESIDENTIA…Proxy configuration
Residential exits are the default: MSC refuses about a quarter of datacenter requests, which makes runs slower. Each tracked number uses only a few kilobytes. If you pick datacenter and MSC refuses too many requests, the run switches to residential on its own.
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 | Detected number type: Container, Bill of Lading or Booking |
| status | string | null | Booked (no container move yet), In transit or Delivered |
| delivered | boolean | null | True when every container of the shipment is delivered |
| billOfLadingNumbers | array | null | Bills of lading behind the number |
| containerNumbers | array | null | Containers on the shipment |
| containerCount | number | null | Number of containers |
| shippedFrom | string | null | Place of receipt |
| shippedTo | string | null | Final destination |
| portOfLoad | string | null | Port of loading |
| portOfDischarge | string | null | Port of discharge |
| transshipments | array | null | Transshipment ports on the route |
| finalPodEta | string | null | Estimated arrival at the port of discharge (YYYY-MM-DD) |
| priceCalculationDate | string | null | Price calculation date shown by MSC (YYYY-MM-DD) |
| latestEventDate | string | null | Date of the latest actual container event (YYYY-MM-DD) |
| latestEventDescription | string | null | Latest container event, e.g. Export Loaded on Vessel |
| latestEventLocation | string | null | Where the latest event happened |
| nextEventDate | string | null | Date of the next planned event, e.g. the estimated arrival (YYYY-MM-DD) |
| nextEventDescription | string | null | Next planned event, e.g. Estimated Time of Arrival |
| nextEventLocation | string | null | Where the next planned event happens |
| latestVesselName | string | null | Vessel of the latest vessel event (the planned one if the container has not sailed yet) |
| latestVoyage | string | null | Voyage of the latest vessel event |
| latestVesselImo | string | null | IMO number of that vessel |
| containers | array | null | Per container: number, type, delivered flag, latest move, ETA and the full event history (date, location, UN/LOCODE, description, laden/empty, estimated flag, vessel, voyage, IMO, flag, terminal) |
| trackingUrl | string | null | msc.com tracking page for the number |
| trackedAt | string | null | When the number was tracked (UTC) |
| tracking_number | string | null | Original MSC record: tracking number |
| tracking_type | string | null | Original MSC record: tracking type |
| bill_of_ladings | array | null | Original MSC record: bills of lading with containers and events |
| found | boolean | null | Only on rows for unknown numbers: false |
| error | string | null | Only on rows for unknown numbers: MSC's message |
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 full container event history). Numbers MSC 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/msc-tracking-scraper').call({
"trackingNumbers": [
"MSCU0203658",
"MEDUEZ472303"
],
"proxyConfiguration": {
"useScrapelyProxy": true,
"scrapelyProxyGroups": [
"RESIDENTIAL"
]
}
})
// 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/msc-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/msc-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.
Five MSC container numbers, typed with spaces and dashes, detected automatically.
MSC bill of lading numbers with every container on each shipment.
Keep only delivered shipments and the last two moves of each container.
Track only the first 4 numbers of a list that also holds an unknown and an invalid entry.
Track over datacenter exits; the run moves to residential exits on its own if MSC refuses them.
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.