War Risk Surcharge Heatmap

0
77

War risk pricing is moving in bursts this year. After fresh attacks and electronic interference warnings, additional premiums on key lanes have surged, softened, and surged again, turning a seven-day cover into a six-figure swing on larger ships. This report pulls the corridors together, shows the current pressure points, and gives fast tools to sanity-check voyage exposure.

📬 Subscribe to the Ship Universe Weekly Newsletter (Free)

War Risk Surcharge Heatmap 2025

Live corridors ranked by premium jumps after new advisories

Lower
Higher

Market signals (recent)

  • Red Sea often trades around the upper end of AP ranges during incident clusters; seven-day covers can reprice within days.
  • Strait of Hormuz lifted toward mid-range AP in June, eased later, remains headline-sensitive.
  • Israeli ports show sharp week-over-week step-ups when alerts increase.
  • /AIS interference advisories continue to feature in routing briefs.

Heads up

AP is negotiated per risk, ship and day. Ranges here are directional for planning; confirm voyage terms with your broker and underwriters before routing.

Corridor pressure board

Corridor / Zone
Typical recent AP*
Drivers of repricing
Operational notes

*AP = Additional Premium for hull war per seven-day period. Ranges vary by hull value, flag, cargo, management, wording and voyage date.

Quick tools and timeline

AP cost snapshot

MR tanker: $45m · 0.45%
VLCC: $110m · 0.5%
Feeder: $25m · 0.35%

Hull value ($m)

AP rate (% / 7 days)

Seven-day AP
$400,000

Per-day equivalent
$57,143

Formula: Hull × (AP% ÷ 100). Per-day = Seven-day ÷ 7.

Cape vs Suez quick check

14k TEU: +9d · $/day · $400k AP · $320k fuel
LR2: +8d · $/day · $300k AP · $220k fuel

Extra days via Cape

TCE / Opex ($/day)

AP on Suez lane ($)

Fuel delta ($ via Cape)

Cape cost add-on
$800,000

Decision (lower is better)
Suez cheaper by $150,000

Rule of thumb: Cape add-on = Extra days × TCE + fuel delta. Compare with AP on Suez.

2025 flashpoints (selected)

  1. June: Hormuz tensions lift AP toward mid-range; softening later with de-escalation headlines.
  2. July: Red Sea casualties and sinkings; AP revisits upper band.
  3. Early October: /AIS interference reported from Port Sudan to the Gulf; market remains headline-driven.

Sequence shows why quotes can whipsaw within a seven-day AP window.

Pre-bind checklist

  • Hull value confirmation and current COI on file.
  • Voyage declaration aligned with the latest Listed Areas and port notices.
  • Route alternatives modeled (AP + fuel + days) with decision notes.
  • Security posture and convoy options documented if applicable.
  • /AIS anomaly log briefed on the bridge and recorded.

Recent AP: ${c.ap}

Drivers: ${c.drivers}
`;
pulseGrid.appendChild(card);
});
// ———- Corridor table ———-
const tbody = document.querySelector(‘#corridorTable tbody’);
corridors.forEach((c,i)=>{
const tr = document.createElement(‘tr’);
if (i % 2 === 1) tr.style.background = ‘#fbfdff’;
tr.innerHTML = `

${c.name} ${c.ap} ${c.drivers} ${c.notes}

`;
tbody.appendChild(tr);
});
// ———- Filter ———-
const filterInput = document.getElementById(‘corridorFilter’);
filterInput.addEventListener(‘input’, ()=> {
const q = filterInput.value.toLowerCase();
[…tbody.querySelectorAll(‘tr’)].forEach(tr=>{
tr.style.display = tr.textContent.toLowerCase().includes(q) ? ” : ‘none’;
});
});
// ———- Sortable headers ———-
(function sortable(){
const ths = document.querySelectorAll(‘#corridorTable thead th’);
let sortIdx = 0, asc = true;
ths.forEach((th,i)=>{
th.style.cursor=’pointer’;
th.addEventListener(‘click’, ()=>{
asc = (sortIdx===i) ? !asc : true; sortIdx = i;
const rows = […tbody.querySelectorAll(‘tr’)].filter(r=>r.style.display!==’none’);
rows.sort((a,b)=>{
const ta = a.children[i].innerText.trim().toLowerCase();
const tb = b.children[i].innerText.trim().toLowerCase();
return asc ?

ta.localeCompare(tb) : tb.localeCompare(ta);
});
rows.forEach(r=>tbody.appendChild(r));
});
});
})();
// ———- CSV download ———-
document.getElementById(‘downloadCsv’).onclick = ()=>{
const headers = [‘Corridor’,’AP’,’Drivers’,’Notes’];
const rows = corridors.map(c=>[c.name,c.ap,c.drivers,c.notes]);
const csv = [headers, …rows].map(r=>r.map(x=>`”${String(x).replace(/”/g,’””‘)}”`).join(‘,’)).join(‘n’);
const blob = new Blob([csv],{type:’/csv;charset=utf-8;’});
const a = document.createElement(‘a’);
a.href = URL.createObjectURL(blob);
a.download = ‘war-risk-corridors.csv’;
a.click();
URL.revokeObjectURL(a.href);
};
// ———- Last updated ———-
const lu = document.getElementById(‘lastUpdated’);
if (lu){
const d = new Date();
lu.textContent = ‘Updated: ‘ + d.toLocaleDateString(undefined,{year:’numeric’,month:’short’,day:’2-digit’});
}
// ———- Calculators ———-
const hull = document.getElementById(‘ap-hull’);
const rate = document.getElementById(‘ap-rate’);
const out = document.getElementById(‘ap-out’);
const day = document.getElementById(‘ap-day’);
function usd(x){return ‘$’+Math.round(x).toLocaleString();}
function recalcAP(){
const hv = Math.max(1, Number(hull.value||0)) * 1e6;
const r = Math.max(0, Number(rate.value||0))/100;
const ap = hv * r;
out.textContent = usd(ap);
day.textContent = usd(ap/7);
}
[hull,rate].forEach(e=>e.addEventListener(‘input’, recalcAP)); recalcAP();
// Presets for AP snapshot
document.getElementById(‘preset-mr’).onclick = ()=>{ hull.value=45; rate.value=0.45; recalcAP(); };
document.getElementById(‘preset-vlcc’).onclick = ()=>{ hull.value=110; rate.value=0.5; recalcAP(); };
document.getElementById(‘preset-feeder’).onclick = ()=>{ hull.value=25; rate.value=0.35; recalcAP(); };
// Break-even calc
const beDays = document.getElementById(‘be-days’);
const beTce = document.getElementById(‘be-tce’);
const beAp = document.getElementById(‘be-ap’);
const beFuel = document.getElementById(‘be-fuel’);
const beOut1 = document.getElementById(‘be-cape’);
const beOut2 = document.getElementById(‘be-decision’);
function recalcBE(){
const days = Math.max(0, Number(beDays.value||0));
const tce = Math.max(0, Number(beTce.value||0));
const ap = Math.max(0, Number(beAp.value||0));
const fuel = Math.max(0, Number(beFuel.value||0));
const cape = days*tce + fuel;
beOut1.textContent = usd(cape);
if (cape > ap) beOut2.textContent = `Suez cheaper by ${usd(cape – ap)}`;
else if (ap > cape) beOut2.textContent = `Cape cheaper by ${usd(ap – cape)}`;
else beOut2.textContent = ‘Even’;
}
[beDays,beTce,beAp,beFuel].forEach(e=>e.addEventListener(‘input’, recalcBE)); recalcBE();
// Presets for break-even
document.getElementById(‘preset-box14k’).onclick = ()=>{ beDays.value=9; beTce.value=65000; beAp.value=400000; beFuel.value=320000; recalcBE(); };
document.getElementById(‘preset-lr2’).onclick = ()=>{ beDays.value=8; beTce.value=55000; beAp.value=300000; beFuel.value=220000; recalcBE(); };
})();