Panama Canal Advisories to Shipping Scraper
Pricing
from $1.20 / 1,000 advisory scrapeds
Panama Canal Advisories to Shipping Scraper
Scrape every ACP Advisory to Shipping: draft restrictions, transit slot and booking rule changes, and monthly canal operations summaries, filterable by year, advisory number and keyword.
Pricing
from $1.20 / 1,000 advisory scrapeds
Rating
0.0
(0)
Developer
Arman Hossain
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
14 days ago
Last modified
Categories
Share

Pulls the Panama Canal Authority's (ACP) public Advisory to Shipping archive: draft
restriction changes, transit slot and booking rule updates, scheduled lock outages, and
the monthly canal operations summary. Every advisory is numbered ADV-NN-YYYY, and this
Actor returns one dataset record per advisory with the number, year, title, category and
a link to the source PDF, filterable by year, advisory number and keyword.
Draft and booking-system advisories move Panamax freight rates and can trigger a Cape-of-Good-Hope reroute decision within a day of publication, so this is a source chartering desks, dry-bulk brokers and insurers watch closely.
No browser, no proxy, no login required to use this Actor.
Agent skill: SKILL.md
https://api.apify.com/v2/key-value-stores/t7YoTxpZEJOWvw4Ug/records/panama-canal-advisories-scraper.md
What you get
| Field | What it holds |
|---|---|
advisoryNumber | The NN in ADV-NN-YYYY, parsed from the filename. Numbering restarts each year. |
year | The YYYY in the same number. |
title | The advisory's title, taken from the filename slug (e.g. Draft-adjustment-in-the-Neopanamax-Locks). null for the handful of advisories whose filename carries no extra text. |
category | Advisory, Monthly Operations Summary or Notice to Shipping, classified from the title. |
pdfUrl | Direct link to the source PDF. |
uploadYearMonth | The YYYY-MM the file was uploaded, read from its storage path. Usually matches year but not always: an advisory can be uploaded the month after the year it is numbered for. |
language | Always en. The archive is published in English only. |
pdfVerified, pdfBytes, pdfContentType | Set only when downloadPdf is on: whether the PDF still resolves, its size and its content type. null otherwise. |
sourceUrl | The archive page this record was read from. |
scrapedAt | Run timestamp. |
RUN_SUMMARY in the key-value store holds per-run counts: how many PDF links were on
the page, how many matched the numbered-advisory pattern, how many matched your filters,
and any PDF that failed its liveness check when downloadPdf is on.
Use cases
- Freight-rate signal. A maximum-authorized-draft change or a transit slot cut is a
leading indicator for Panamax rates; alert on new
Advisoryrows matchingdraftorbooking. - Chartering and routing desks. Watch for scheduled lock outages and speed restrictions that affect transit windows before they hit the news wire.
- Operations monitoring. Pull the
Monthly Operations Summaryrows on a schedule to track transit counts and tonnage trends over time. - Compliance archive. Keep a running, de-duplicable record of every advisory number issued, so a gap in the sequence is visible immediately.
- Newsletter and briefing sourcing.
titleandpdfUrlare enough to link out to the source document without re-hosting it.
Quick start
The full archive, every advisory ACP has published:
{}
Recent draft and booking advisories only:
{"yearFrom": 2025,"keywords": ["draft", "booking", "transit"]}
The last 20 advisories, with each PDF verified as still live:
{"maxAdvisories": 20,"downloadPdf": true}
Input
| Field | Type | Default | Notes |
|---|---|---|---|
yearFrom | integer | 0 | Keep advisories from this year on, by their own ADV-NN-YYYY year, not upload date. 0 means no lower bound. |
yearTo | integer | 0 | Keep advisories up to and including this year. 0 means no upper bound. |
advisoryNumberFrom | integer | 0 | Drop advisories numbered below this. Numbering restarts each year, so this filters within a year. 0 means no filter. |
keywords | array | [] | Keep only advisories whose title contains at least one of these words or phrases (draft, booking, transit, maximum authorized draft). Case-insensitive; hyphens in the title are treated as spaces. Empty keeps everything. |
downloadPdf | boolean | false | HEAD-request each matching PDF to confirm it still resolves and record its size and content type. One extra request per advisory. |
maxAdvisories | integer | 0 | Stop after this many advisories, newest (year, then advisory number) first. 0 returns every match. |
Nothing is required. Running with no input returns the entire archive, currently a few hundred advisories.
Output example
{"advisoryNumber": 25,"year": 2026,"title": "Adjustment-to-the-Maximum-Allowable-Draft-in-the-Neopanamax-Locks","category": "Advisory","pdfUrl": "https://pancanal.com/wp-content/uploads/2026/08/ADV-25-2026-Adjustment-to-the-Maximum-Allowable-Draft-in-the-Neopanamax-Locks.pdf","uploadYearMonth": "2026-08","language": "en","pdfVerified": null,"pdfBytes": null,"pdfContentType": null,"sourceUrl": "https://pancanal.com/en/maritime-services/advisory-to-shipping/","scrapedAt": "2026-08-21T12:00:00.000Z"}
A monthly summary record:
{"advisoryNumber": 26,"year": 2026,"title": "Monthly-Canal-Operations-Summary-July-2026","category": "Monthly Operations Summary","pdfUrl": "https://pancanal.com/wp-content/uploads/2026/08/ADV-26-2026-Monthly-Canal-Operations-Summary-July-2026.pdf","uploadYearMonth": "2026-08","language": "en"}
API example
curl -X POST "https://api.apify.com/v2/acts/arman-bd~panama-canal-advisories-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN" \-H "Content-Type: application/json" \-d '{"yearFrom": 2025,"keywords": ["draft", "booking"]}'
JavaScript example
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: 'YOUR_TOKEN' });const run = await client.actor('arman-bd/panama-canal-advisories-scraper').call({yearFrom: 2025,keywords: ['draft', 'booking', 'transit'],});const { items } = await client.dataset(run.defaultDatasetId).listItems();for (const a of items) console.log(`ADV-${a.advisoryNumber}-${a.year} [${a.category}] ${a.title}`);
Notes
- The archive page lists advisories in ascending order; this Actor returns them newest first (year, then advisory number, both descending) so a capped run gets recent advisories rather than 2020's.
- Advisory numbers restart each year, so
advisoryNumberFromonly makes sense combined with ayearFrom/yearTorange unless you want it applied globally across years. - A small number of PDFs on the source site (roughly 1 in 100) don't follow the
ADV-NN-YYYYnaming convention, older tolls schedules, forms, and a few inconsistently-named advisories. Those are intentionally excluded; this Actor covers the numbered advisory series. titleis derived from the filename, not the PDF body. It is a close read of the advisory's subject but occasional source-side typos (e.g. "Montly" for "Monthly") carry straight through, andcategoryclassification is typo-tolerant for the ones that are known to recur.- Occasionally a revised advisory is republished as a second PDF for the same number
(e.g. a filename ending
Rev1). Both are returned as separate records with the sameadvisoryNumber/year; the more recent one is the correction.
FAQ
Do I need an account with the Panama Canal Authority? No. You supply no credentials.
Can I get the PDF text itself, not just the filename-derived fields? No, this Actor
returns the index (number, year, title, category, link) and optionally verifies the PDF
is live. Fetch pdfUrl yourself for the document body.
Is there a Spanish-language version? Not for this archive. The Panama Canal
Authority publishes the Advisory to Shipping series in English only; language is
therefore a constant field.
How current is this? The archive updates within a day of a new advisory being
issued, several times a month on average. Run this Actor on a schedule and diff on
advisoryNumber/year to catch new ones.
Does maxAdvisories fetch only the newest, or filter after fetching everything? The
whole archive is read every run (it is one page), then filtered and sorted, then capped.
maxAdvisories bounds what is saved and charged, not what is read.
Can I plug it into something else? Yes. Apify API, the client libraries, webhooks, scheduled runs, dataset exports to JSON, CSV or Excel, or MCP. The output is structured JSON.