Panama Canal Advisories to Shipping Scraper avatar

Panama Canal Advisories to Shipping Scraper

Pricing

from $1.20 / 1,000 advisory scrapeds

Go to Apify Store
Panama Canal Advisories to Shipping Scraper

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

Arman Hossain

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

14 days ago

Last modified

Categories

Share

Panama Canal Advisories: The full numbered advisory archive, with draft restrictions, tolls and booking notices

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

FieldWhat it holds
advisoryNumberThe NN in ADV-NN-YYYY, parsed from the filename. Numbering restarts each year.
yearThe YYYY in the same number.
titleThe 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.
categoryAdvisory, Monthly Operations Summary or Notice to Shipping, classified from the title.
pdfUrlDirect link to the source PDF.
uploadYearMonthThe 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.
languageAlways en. The archive is published in English only.
pdfVerified, pdfBytes, pdfContentTypeSet only when downloadPdf is on: whether the PDF still resolves, its size and its content type. null otherwise.
sourceUrlThe archive page this record was read from.
scrapedAtRun 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 Advisory rows matching draft or booking.
  • 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 Summary rows 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. title and pdfUrl are 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

FieldTypeDefaultNotes
yearFrominteger0Keep advisories from this year on, by their own ADV-NN-YYYY year, not upload date. 0 means no lower bound.
yearTointeger0Keep advisories up to and including this year. 0 means no upper bound.
advisoryNumberFrominteger0Drop advisories numbered below this. Numbering restarts each year, so this filters within a year. 0 means no filter.
keywordsarray[]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.
downloadPdfbooleanfalseHEAD-request each matching PDF to confirm it still resolves and record its size and content type. One extra request per advisory.
maxAdvisoriesinteger0Stop 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 advisoryNumberFrom only makes sense combined with a yearFrom/yearTo range 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-YYYY naming convention, older tolls schedules, forms, and a few inconsistently-named advisories. Those are intentionally excluded; this Actor covers the numbered advisory series.
  • title is 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, and category classification 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 same advisoryNumber/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.