Most vessel risk scores arrive as one number. "Risk: 72." When a counterparty, an underwriter or an auditor asks why 72, the only honest answer is "the vendor said so". That is not an answer anyone wants to give.
Our vetting grade runs from 0 (best) to 100 (worst) and maps to a letter from A to E. Everything that goes into it is below, and all of it comes back from the API, so you can rebuild the number yourself.
The five factors
Each factor is scored 0 to 100, worst at 100, and weighted:
| Factor | Weight | How it is scored |
|---|---|---|
| Detention history | 30% | Port state control detentions on record: none 0, one 40, two 70, three or more 100 |
| Flag performance | 25% | The worse of the flag's Paris MoU and Tokyo MoU listings: white 0, grey 50, black 100 |
| Ownership opacity | 20% | How hard the owner is to trace: no LEI on record, an opaque flag register, a designated company in the chain |
| Vessel age | 15% | 5 years or less 0, up to 10 years 15, up to 15 years 35, up to 20 years 60, up to 25 years 80, older 100 |
| Inspection gap | 10% | Time since the last port state control inspection: within 6 months 0, within a year 15, within two years 40, within three years 65, longer 85 |
The grade is the weighted sum, rounded. Up to 20 is A, up to 40 B, up to 60 C, up to 80 D, and above that E. A and B read acceptable, C marginal, D substandard and E unacceptable.
Unknowns are left out, not guessed
Some factors cannot always be measured. We may hold no build year, no port state control record, or no regime may rate the flag. A score that fills those gaps with a default looks complete and is not. Until September our own grade did exactly that: a factor the API reported as unobserved could still move the number. On one hull, ten of eighteen points came from two factors we had not measured.
Now an unobserved factor is excluded, and its weight is shared out across the factors we did observe. In the API it reads observed: false, score: null and weight_pct: 0, so the weights you are shown always add up to the score you are shown. Ownership always carries weight, so there is always something to weigh. If nothing about a hull can be assessed, there is no grade at all: assessed: false and a null grade, never a stand-in letter.
Two floors, and they say so
A weighted average can talk a sanctioned ship into a decent grade. A young tanker under a white-list flag with no detentions would score well on most factors, and a designated ship is not one anyone should read as grade B. So two facts override the average:
- A confirmed sanctions match, meaning the hull's own IMO or MMSI on a designating list, floors the score at 90, grade E.
- An exact-IMO listing on a watchlist that does not itself designate floors it at 61, the bottom of grade D. That is the same listing that turns the sanctions verdict AMBER, so the grade cannot read better than the verdict beside it.
A floor is never silent. On a key, the screening record carries score_floor with the basis, the published value, and weighted_score: the number the five factors do add up to. Build your charts and thresholds on weighted_score, not on the floored score.
A real one: MT JUMBO
IMO 9290335, a tanker matched by exact IMO on the EU and UK lists. On 10 October its five factors read:
| Factor | Score | Weight | Points |
|---|---|---|---|
| Detention history | 0 | 30% | 0 |
| Flag performance | 100 | 25% | 25 |
| Ownership opacity | 100 | 20% | 20 |
| Vessel age | 80 | 15% | 12 |
| Inspection gap | 40 | 10% | 4 |
| Weighted score | 61 | ||
Sixty-one is grade D on its own. The confirmed match floors it at 90, so the published grade is E, and the record says the factors alone would have given 61. A clean detention record did not rescue it, and should not have.
Reading it from the API
The keyless check returns the grade with no account:
curl https://arcnautical.com/api/v1/vessels/9290335/check
"vetting": { "grade": "E", "score": 90, "status": "unacceptable" },
"assessed": true
On a free key, POST /api/v1/screenings adds the parts: a factors array with factor, score, weight_pct and observed for each of the five, plus detention_count and score_floor. Two rules for code that reads it:
- Branch on
assessedbefore you read the grade. - Threshold on
observedbefore you threshold on a factor'sscore. Anulldetention count means we hold no port state control record for the hull, which is not the same fact as "no detentions".
What the grade is not
- It is not the sanctions verdict. That is a separate field with its own four states, and a hull can be GREEN and grade D.
- Ownership opacity measures the public record, not wrongdoing. EVER GIVEN, a clean ship, scores opacity 70 because its owner has no LEI on record and its Panamanian register publishes no beneficial owner. It still grades A.
- It is not a prediction. It summarises what the record shows today.
Rebuild one yourself
Run curl https://arcnautical.com/api/v1/vessels/9811000/check, then read the field reference in the API docs. The methodology lists every source behind each factor.