<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: VesselAPI</title>
    <description>The latest articles on Forem by VesselAPI (@vessel_api).</description>
    <link>https://forem.com/vessel_api</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3838965%2Fd6a827f7-26de-4683-a155-c41378675ee7.jpg</url>
      <title>Forem: VesselAPI</title>
      <link>https://forem.com/vessel_api</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/vessel_api"/>
    <language>en</language>
    <item>
      <title>Every Ship Has a Secret Resume</title>
      <dc:creator>VesselAPI</dc:creator>
      <pubDate>Sat, 04 Apr 2026 22:27:01 +0000</pubDate>
      <link>https://forem.com/vessel_api/every-ship-has-a-secret-resume-1ji8</link>
      <guid>https://forem.com/vessel_api/every-ship-has-a-secret-resume-1ji8</guid>
      <description>&lt;p&gt;In 2011, a Japanese shipyard delivered a bulk carrier called &lt;em&gt;21 Glory&lt;/em&gt;. She was 37,000 deadweight tonnes — a handymax, built to carry grain, coal, and steel through the regional trade lanes of the Pacific.&lt;/p&gt;

&lt;p&gt;Stamped into her classification record was this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;NS*(BCM-A, BC-XII, GRAB)(PS-DA&amp;amp;FA)(IWS) MNS*&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That is not a random string. It is a professional credential — a coded statement, issued by a classification society, that specifies what this ship is built to do, what she has been inspected for, and what she is permitted to carry.&lt;/p&gt;

&lt;p&gt;Lloyd's Register began recording ship conditions in a London coffee house in 1760. The core concept has not changed: independent examination, encoded into standardized formats. The notation string is the output.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reading the Notation
&lt;/h2&gt;

&lt;p&gt;Here is what &lt;em&gt;21 Glory&lt;/em&gt;'s notation means, token by token:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Token&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;NS*&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Hull notation by ClassNK; asterisk indicates approved plans and surveyed construction&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;BCM-A&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Bulk carrier strengthened for heavy cargo in all holds with alternate loading approval&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;BC-XII&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;SOLAS Chapter XII bulk carrier structural compliance&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;GRAB&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Hull reinforced for grab (mechanical clamshell) discharge&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;PS-DA&amp;amp;FA&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Structural strength program using Direct Analysis and Fatigue Assessment&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;IWS&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;In-Water Survey eligibility — divers instead of dry-dock&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;MNS*&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Machinery notation with full-survey standard&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A vessel without &lt;code&gt;BCM-A&lt;/code&gt; would be unsuitable for iron ore with alternating empty holds.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;GRAB&lt;/code&gt; notation deserves special attention. Grab discharge means a crane lowers a massive clamshell bucket into the hold and scoops cargo out. The impact on the tank top — the hull interior — is enormous. Vessels rated for grab discharge have reinforced scantlings: thicker plating, stronger frames, additional stiffening. A vessel without this reinforcement risks structural damage during or after grab operations.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Rosetta Stone Problem
&lt;/h2&gt;

&lt;p&gt;There is no universal notation language. Each classification society invented its own.&lt;/p&gt;

&lt;p&gt;There are approximately a dozen major societies worldwide (IACS members), and they encode identical capabilities differently:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Bulk carrier heavy cargo:&lt;/strong&gt; &lt;code&gt;BCM-A&lt;/code&gt; (ClassNK) vs &lt;code&gt;BC-A&lt;/code&gt; (Bureau Veritas, CCS, Korean Register)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Unattended machinery:&lt;/strong&gt; &lt;code&gt;M0&lt;/code&gt; (ClassNK), &lt;code&gt;AUT-UMS&lt;/code&gt; (Bureau Veritas), &lt;code&gt;AUT-0&lt;/code&gt; (CCS), &lt;code&gt;UMA&lt;/code&gt; (Korean Register)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk2y32dukzwlgth7hgmmk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk2y32dukzwlgth7hgmmk.png" alt=" " width="800" height="448"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Korean Register wraps notations in single quotes. CCS uses Unicode parentheses. One Bureau Veritas vessel had a notation string that was 847 characters long — with occasional full-width Unicode parentheses mixed in.&lt;/p&gt;

&lt;p&gt;Our first attempt at a cross-society parser took about a day to write and about three weeks to debug.&lt;/p&gt;

&lt;p&gt;Classification societies predate international standardization bodies by over a century. Lloyd's Register predated the first International Load Line Convention (1930) by 170 years. By the time anyone thought about harmonization, the notation formats were embedded in thousands of certificates, contracts, and insurance policies. Only Common Structural Rules (adopted 2006, harmonized 2015) achieved genuine cross-society alignment — which is why &lt;code&gt;CSR&lt;/code&gt; appears nearly identically across societies.&lt;/p&gt;

&lt;h2&gt;
  
  
  What We Built
&lt;/h2&gt;

&lt;p&gt;We built collectors for six classification societies, parsing notation strings without normalization. The rationale: the notation string is a legal document, and paraphrasing a legal document is how you get sued.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="s2"&gt;"https://api.vesselapi.com/v1/vessel/9468217/classification?filter.idType=imo"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer YOUR_API_KEY"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"classification"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"identification"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"vesselName"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"21 GLORY"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"imoNumber"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"9468217"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"flagName"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Singapore"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"classStatusString"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"In Class"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"classification"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"mainClass"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"NS*"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"classNotationString"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"NS*(BCM-A, BC-XII, GRAB)(PS-DA&amp;amp;FA)(IWS) MNS*"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"surveys"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"survey"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Special Survey"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"lastDate"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"21 Jan 2026"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"dueFrom"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"14 Sep 2030"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"dueTo"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"survey"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Intermediate Survey"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"dueFrom"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"14 Jun 2027"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"dueTo"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"14 Dec 2027"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"survey"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Annual Survey"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"dueFrom"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"14 Jun 2026"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"dueTo"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"14 Dec 2026"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"yard"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"hullYardName"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"SAIKI HEAVY INDUSTRIES CO., LTD."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"keelDate"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"10 Dec 2010"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"dateOfBuild"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"22 Apr 2011"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"dimensions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"dwt"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;37202&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"grossTon69"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;22863&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fthmmw0c4f33tul8pu7pn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fthmmw0c4f33tul8pu7pn.png" alt=" " width="800" height="448"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Coverage
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Classification Society&lt;/th&gt;
&lt;th&gt;Vessels with Notation Data&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Nippon Kaiji Kyokai (ClassNK)&lt;/td&gt;
&lt;td&gt;~8,900&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Det Norske Veritas (DNV)&lt;/td&gt;
&lt;td&gt;~8,300&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bureau Veritas (BV)&lt;/td&gt;
&lt;td&gt;~7,500&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;China Classification Society (CCS)&lt;/td&gt;
&lt;td&gt;~4,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Registro Italiano Navale (RINA)&lt;/td&gt;
&lt;td&gt;~2,800&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Korean Register (KR)&lt;/td&gt;
&lt;td&gt;~1,900&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Total&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~33,400&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Not all vessels carry additional notations; some older or simpler ships have only base class symbols.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the Notation String Decides
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Cargo Suitability.&lt;/strong&gt; The notation determines cargo compatibility. For iron ore shipments, charterers verify for &lt;code&gt;BC-A&lt;/code&gt; (or equivalent) and &lt;code&gt;GRAB&lt;/code&gt;. A &lt;code&gt;BC-B&lt;/code&gt; vessel has restrictions on hold usage and draught, affecting loading patterns and structural safety. Getting this wrong is not a paperwork problem. It is a the-ship-might-break problem.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Survey Cycles.&lt;/strong&gt; &lt;em&gt;21 Glory&lt;/em&gt;'s record shows a Special Survey completed January 21, 2026, with the next due by September 2030. The Special Survey is the big one — a comprehensive inspection every five years, often requiring dry-docking, costing hundreds of thousands of dollars. Vessels near their deadline face potential delays, detention risk, or class loss if certification lapses.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Compliance Signals.&lt;/strong&gt; Notations like &lt;code&gt;PSPC-WBT&lt;/code&gt; (ballast tank protective coatings) and &lt;code&gt;IHM&lt;/code&gt; (Inventory of Hazardous Materials) signal IMO convention compliance. In some ports, missing an expected notation is functionally an invitation to be boarded and detained by port state control.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Operational Quality Proxy.&lt;/strong&gt; Notations including &lt;code&gt;ESP&lt;/code&gt; (Enhanced Survey Programme), &lt;code&gt;IWS&lt;/code&gt;, and &lt;code&gt;CMS&lt;/code&gt; (Continuous Machinery Survey) correlate with better maintenance. They are a useful filter when screening numerous vessel candidates — not definitive proof of quality, but a signal.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try It
&lt;/h2&gt;

&lt;p&gt;The endpoint is at &lt;code&gt;/vessel/{id}/classification?filter.idType=imo&lt;/code&gt;. Lloyd's Register and ABS are on the roadmap.&lt;/p&gt;

&lt;p&gt;Somewhere right now, a surveyor is climbing into a ballast tank with a flashlight and an ultrasonic thickness gauge, measuring the steel plate by plate, writing down what she finds. The notation string is the output. We just make it queryable.&lt;/p&gt;

</description>
      <category>maritime</category>
      <category>api</category>
      <category>data</category>
    </item>
    <item>
      <title>Crude Oil on the Water: Tracking Tanker Flows with Claude and a Maritime API</title>
      <dc:creator>VesselAPI</dc:creator>
      <pubDate>Sun, 22 Mar 2026 22:25:03 +0000</pubDate>
      <link>https://forem.com/vessel_api/crude-oil-on-the-water-tracking-tanker-flows-with-claude-and-a-maritime-api-29f0</link>
      <guid>https://forem.com/vessel_api/crude-oil-on-the-water-tracking-tanker-flows-with-claude-and-a-maritime-api-29f0</guid>
      <description>&lt;p&gt;Just after midnight UTC today, a 274-metre crude oil tanker called ALTURA slipped out of Novorossiysk, Russia's largest Black Sea crude export terminal. She's flagged to Sierra Leone at the time of this query, which tells you nothing about where she was built and almost nothing about who owns her. (Shadow fleet vessels re-flag frequently. ALTURA has had at least three names and flags since 2023.) At 163,750 deadweight tonnes, she's a Suezmax, designed to transit the Suez Canal fully loaded, carrying up to around a million barrels of crude. Right now she's somewhere south of Novorossiysk, heading for the Turkish Straits.&lt;/p&gt;

&lt;p&gt;You probably don't care about any of that. Unless you trade oil.&lt;/p&gt;

&lt;p&gt;If you do, that departure is a data point -- one of nine tankers that left Novorossiysk today alone, ranging from Suezmax crude carriers down to small coastal chemical tankers. Multiply by Primorsk, Ust-Luga, Al Jubail, and the rest of the world's export terminals, and you get the global crude supply picture: not a number in a spreadsheet, but a fleet of ships you can actually watch move.&lt;/p&gt;

&lt;p&gt;The firms that turn this into a product -- Kpler, Vortexa, Windward -- charge serious money for it. They should; their platforms layer satellite imagery, cargo manifests, and proprietary models on top of the raw vessel data. But the raw vessel data itself? That part is more accessible than you might think.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Oil Is on the Water
&lt;/h2&gt;

&lt;p&gt;Here's the thing about seaborne crude: unlike a pipeline, it's visible.&lt;/p&gt;

&lt;p&gt;Every tanker over 300 gross tonnes carries an AIS transponder -- a radio beacon that broadcasts position and speed every few seconds when underway, along with identity and destination data at longer intervals. Originally designed to prevent collisions, AIS has become the accidental backbone of commodity intelligence. If a VLCC loads crude at Ras Tanura and sets course for Ningbo, you can see it happen.&lt;/p&gt;

&lt;p&gt;The signals that matter to a commodity desk are straightforward:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Departures from export terminals&lt;/strong&gt; -- Novorossiysk, Ust-Luga, Primorsk (Russia), Al Jubail, Ras Tanura (Saudi Arabia), Basra (Iraq). Each departure is supply entering the water.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Arrivals at refinery ports&lt;/strong&gt; -- Rotterdam, Singapore, Ningbo, Houston. Each arrival is supply being consumed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Vessels in transit&lt;/strong&gt; -- who's heading where, when they'll arrive, how deep they're sitting in the water. A tanker's draught is a rough proxy for how much cargo she's carrying.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The vessel herself&lt;/strong&gt; -- flag state, owner, classification society, inspection record. These details separate the compliant fleet from the "shadow fleet" that moves sanctioned barrels.&lt;/p&gt;

&lt;p&gt;None of this is secret. It's just scattered across different systems and formats. The trick is querying it conversationally instead of writing integration code.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Setup
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://modelcontextprotocol.io" rel="noopener noreferrer"&gt;MCP&lt;/a&gt; (Model Context Protocol) lets an AI model call external APIs during a conversation -- so it retrieves live data rather than guessing from training data. &lt;a href="https://vesselapi.com" rel="noopener noreferrer"&gt;VesselAPI&lt;/a&gt; provides the maritime data: AIS positions, port events, EU MRV emissions, port state inspections, and vessel registry information, wrapped in an MCP server.&lt;/p&gt;

&lt;p&gt;Add this to your project root as &lt;code&gt;.mcp.json&lt;/code&gt; (requires Node.js 18+):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"vesselapi"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"-y"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"vesselapi-mcp"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"env"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"VESSELAPI_API_KEY"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"YOUR_API_KEY"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sign up at &lt;a href="https://vesselapi.com" rel="noopener noreferrer"&gt;vesselapi.com&lt;/a&gt; for a free API key. The JSON structure is the same across MCP clients -- file location varies (Cursor reads &lt;code&gt;.mcp.json&lt;/code&gt; from the project root; Claude Desktop uses its own settings path). That's the entire setup.&lt;/p&gt;

&lt;h2&gt;
  
  
  Watching the Black Sea
&lt;/h2&gt;

&lt;p&gt;I asked Claude: &lt;em&gt;"What tankers departed Novorossiysk today?"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The model called &lt;code&gt;list_port_events&lt;/code&gt; with the port's UN/LOCODE (RUNVS) and a departure filter. The raw results included everything: tankers, bulk carriers loading grain, tugs, service vessels. Novorossiysk isn't just an oil port. I had to call &lt;code&gt;get_vessel&lt;/code&gt; on each result to check the type, then filtered to tankers:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Vessel&lt;/th&gt;
&lt;th&gt;IMO&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Flag&lt;/th&gt;
&lt;th&gt;Size&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;ALTURA&lt;/td&gt;
&lt;td&gt;9292199&lt;/td&gt;
&lt;td&gt;Crude Oil Tanker&lt;/td&gt;
&lt;td&gt;Sierra Leone&lt;/td&gt;
&lt;td&gt;274m, 163,750 DWT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ANTARCTICA&lt;/td&gt;
&lt;td&gt;9910492&lt;/td&gt;
&lt;td&gt;Oil Tanker&lt;/td&gt;
&lt;td&gt;Liberia&lt;/td&gt;
&lt;td&gt;274m x 50m&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NISSOS SIKINOS&lt;/td&gt;
&lt;td&gt;9884033&lt;/td&gt;
&lt;td&gt;Tanker&lt;/td&gt;
&lt;td&gt;Marshall Islands&lt;/td&gt;
&lt;td&gt;274m x 48m&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TATIANA&lt;/td&gt;
&lt;td&gt;9340128&lt;/td&gt;
&lt;td&gt;Oil/Chemical Tanker&lt;/td&gt;
&lt;td&gt;Liberia&lt;/td&gt;
&lt;td&gt;183m, 38,396 DWT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ENERGY DIONE&lt;/td&gt;
&lt;td&gt;9995973&lt;/td&gt;
&lt;td&gt;Tanker&lt;/td&gt;
&lt;td&gt;United Kingdom&lt;/td&gt;
&lt;td&gt;274m x 48m&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Three Suezmax-class vessels in a single day from one port. Look at the flags: Sierra Leone, Liberia, Marshall Islands, Liberia, United Kingdom. Four of five are registered to open registries -- countries with no meaningful connection to the cargo, the crew, or the route. That pattern has a name in the industry: flag of convenience. And when you see it concentrated at an oil terminal under sanctions pressure, it gets more specific: shadow fleet. Only ENERGY DIONE flies a flag you'd expect from a vessel operating in compliant trade.&lt;/p&gt;

&lt;p&gt;I picked ANTARCTICA and asked: &lt;em&gt;"Tell me everything about this vessel."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The model pulled &lt;code&gt;get_vessel&lt;/code&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Type:&lt;/strong&gt; Oil tanker&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Flag:&lt;/strong&gt; Liberia&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Length:&lt;/strong&gt; 274m, &lt;strong&gt;Beam:&lt;/strong&gt; 50m&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Home port:&lt;/strong&gt; Monrovia&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those are Suezmax dimensions. She's big enough to matter.&lt;/p&gt;

&lt;p&gt;Then: &lt;em&gt;"What are her emissions?"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The model called &lt;code&gt;get_vessel_emissions&lt;/code&gt; and returned her EU MRV data:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;2024:&lt;/strong&gt; 3,382 tonnes CO2, 1,084 tonnes fuel consumed, 993 hours at sea&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;2023:&lt;/strong&gt; 7,616 tonnes CO2, 2,431 tonnes fuel consumed, 1,686 hours at sea&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Technical efficiency:&lt;/strong&gt; 2.57 gCO2/t.nm&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Her 2024 emissions dropped by more than half. Not because she got cleaner -- because she spent half as much time at sea. That's consistent with a vessel that spent part of the year in floating storage or waiting for cargo. My guess is sanctions-related delays, but oversupply looks the same from the outside. Either way, a tanker that suddenly halves its sea time is a signal worth flagging.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"Where is she right now?"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;get_vessel_position&lt;/code&gt; returned:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Position:&lt;/strong&gt; 44.71 degreesN, 37.85 degreesE&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Speed:&lt;/strong&gt; 6.6 knots, course 200.6 degrees&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;She's in the Black Sea, heading south-southwest for the Bosphorus. If she's carrying Urals crude, she'll transit the Turkish Straits and enter the Mediterranean. Then the question becomes whether she heads west toward Europe or east toward the Suez and Asia. That routing decision, visible in real-time via AIS, tells you something about where Russian crude is finding buyers.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Other Side
&lt;/h2&gt;

&lt;p&gt;I flipped to the import side: &lt;em&gt;"What tankers are heading to Rotterdam in the next few days?"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The model constructed an ETA window and called &lt;code&gt;get_port_inbound&lt;/code&gt;. Among the results: HAIGUI -- an Oil Products Tanker, Liberian-flagged, 114,900 DWT, built by Samsung Heavy Industries. She's sitting at a draught of 13.2 metres. For a vessel that size, that draught means she's carrying serious weight.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"Check her inspection record."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;17 inspections across five regimes -- Paris MoU, Tokyo MoU, Indian Ocean MoU, Black Sea MoU, US Coast Guard. Zero detentions. Only 4 deficiencies across over a decade of inspections. Ports visited include Rotterdam, Houston, Philadelphia, Amsterdam, Sydney, Ulsan, Dalian, Mombasa. That's a vessel with a global trading pattern and a clean compliance record -- the kind of ship a European refiner accepts without questions.&lt;/p&gt;

&lt;p&gt;Her former name was GULF VALOUR until 2019. Name changes and ownership transfers are routine in commercial shipping, but they're also the bread crumbs that sanctions investigators follow. When a vessel changes name and flag within a short window, it's worth checking why.&lt;/p&gt;

&lt;h2&gt;
  
  
  Building the Signal
&lt;/h2&gt;

&lt;p&gt;If I were building this into something real, the first thing I'd automate is departure counts from Novorossiysk and Primorsk. Week-over-week changes in Suezmax departures from Russian Black Sea ports are the crude signal -- more departures means more supply on the water, and you can estimate rough volumes by vessel class.&lt;/p&gt;

&lt;p&gt;The import side is harder and more interesting. Counting arrivals at Rotterdam, Ningbo, and Jamnagar tells you where the oil is going. If European arrivals drop while Indian arrivals spike, that's a sanctions-driven rerouting -- exactly the kind of structural shift that moves Brent-Dubai spreads before the commentary catches up.&lt;/p&gt;

&lt;p&gt;I tried to see if departure counts from Novorossiysk correlated with anything in the Brent forward curve. With only a week of port event data, the answer is: not enough signal, just noise. You'd need months. But the data is accumulating daily, and it's the same data that professional cargo-tracking firms start from before layering on satellite imagery and bill-of-lading records.&lt;/p&gt;

&lt;p&gt;The compliance angle is arguably the most interesting for a smaller operation. Cross-reference departing vessels against classification records and inspection histories. A Suezmax with no classification society, no inspection record, and a Sierra Leone flag departing Novorossiysk is a different kind of data point than a Lloyd's-classed, Paris MoU-inspected vessel doing the same run. That distinction is worth money to compliance teams and underwriters.&lt;/p&gt;

&lt;p&gt;You could set up a daily cron job with the Claude API to pull departures from ten export terminals. Pipe it into DuckDB. Track week-over-week. Build alerts for when a port goes quiet, or when shadow fleet tonnage surges at a terminal that normally services compliant trade.&lt;/p&gt;

&lt;p&gt;Everything in this post came from live API calls on March 22, 2026. The results will be different tomorrow. That's the point. Sign up at &lt;a href="https://vesselapi.com" rel="noopener noreferrer"&gt;vesselapi.com&lt;/a&gt; for a free key, drop the &lt;code&gt;.mcp.json&lt;/code&gt; from the Setup section into your project root, and start asking. Try &lt;em&gt;"What crude oil tankers departed Primorsk in the last 12 hours?"&lt;/em&gt; or &lt;em&gt;"Find all tankers heading to Singapore -- which ones have the deepest draught?"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This was crude oil. The same approach works for LNG carriers at Sabine Pass, iron ore bulkers at Port Hedland, container ships stacking up outside Shanghai. The data is the same. The questions change.&lt;/p&gt;

&lt;p&gt;The oil is on the water. Now you can see it.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Data queried from VesselAPI on March 22, 2026 via &lt;code&gt;vesselapi-mcp&lt;/code&gt;. Port events return all vessel types; filtering to tankers requires a second vessel-detail lookup. EU MRV emissions are self-reported and independently verified. AIS identifiers can be spoofed. This is not financial advice.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>tutorial</category>
      <category>api</category>
      <category>trading</category>
    </item>
  </channel>
</rss>
