Supplier API
One endpoint. Post an array of prices, get back what published and what was held. There is no SDK to install and no integration to schedule a call about — if your system already has today’s numbers, this is one HTTP request.
Get a key
Open the supplier portal with the address your desk quotes from. The link that arrives signs you in, and your key is on that page. Keys start with bfps_ and never expire; you can rotate one from the same page.
Treat it as a password. Anyone holding it can post prices in your name, and a wrong price attributed to you is worse for you than for us.
Post prices
POST https://bunkerfuelprices.com/api/v1/supplier/prices
curl -X POST https://bunkerfuelprices.com/api/v1/supplier/prices \
-H "Authorization: Bearer bfps_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"prices": [
{ "port": "SGSIN", "grade": "VLSFO", "amount": 784.50 },
{ "port": "SGSIN", "grade": "MGO", "amount": 1146.00 },
{ "port": "AEFJR", "grade": "VLSFO", "amount": 795.00,
"minMt": 200, "validHours": 24, "basis": "delivered" }
]
}'Fields
| Field | Type | Notes | |
|---|---|---|---|
| port | string | required | UN/LOCODE, five letters — SGSIN, NLRTM, AEFJR. Not the port name. An unknown code is rejected for that row only; the rest still post. |
| grade | enum | required | VLSFO · HSFO · MGO · ULSFO · LNG · B24 · B30 |
| amount | number | required | The price, in the currency and unit below. |
| currency | USD | EUR | optional | Defaults to USD. EUR is converted at the live ECB reference rate on the day. |
| unit | mt | litre | m3 | optional | Defaults to mt. Per-litre figures are converted using the density of the grade. |
| basis | delivered | ex_wharf | fob | optional | Defaults to delivered. This matters: an ex-wharf price shown as delivered understates what a buyer pays, and we compare only within a basis. |
| minMt | number | optional | Minimum parcel the price applies to. |
| validHours | 1–168 | optional | How long it stands. Defaults to 24, after which it is marked stale rather than shown as current. |
| taxIncluded | boolean | optional | Defaults to false. Relevant mainly for yacht berths. |
Response
{
"accepted": 3,
"published": 2,
"held": 1,
"results": [
{ "port": "SGSIN", "grade": "VLSFO", "ok": true, "published": true,
"submissionId": "..." },
{ "port": "SGSIN", "grade": "MGO", "ok": true, "published": true,
"submissionId": "..." },
{ "port": "AEFJR", "grade": "VLSFO", "ok": true, "published": false,
"heldForReview": ["38% away from the $795 median across 6 other ports"] }
]
}A row far from the market at other ports is held for a person rather than published. That is not doubt about you — it is what stops one mistyped number becoming a figure a buyer acts on, and it protects your name more than ours. Held prices are normally released the same day.
Rows are independent. A bad row does not reject the batch.
Read back what we hold
curl https://bunkerfuelprices.com/api/v1/supplier/prices \ -H "Authorization: Bearer bfps_YOUR_KEY"
Returns your last hundred submissions with their status, so you can reconcile without keeping your own log of what we accepted.
The public price board
Open, no key needed, and useful for checking where your price sits against the rest of the market before you post it.
curl "https://bunkerfuelprices.com/api/v1/prices?grade=VLSFO&limit=50"
Errors and limits
| Status | Meaning |
|---|---|
| 200 | Processed. Check results — a 200 does not mean every row published. |
| 400 | The body did not parse. The response names the field. |
| 401 | Missing, wrong, or paused key. |
Up to 200 prices per request. Post as often as you like — most desks post once in the morning and again if the market moves. Re-posting the same port and grade supersedes the earlier price rather than duplicating it.
What we do with it
Your price appears on the port page as indicative, credited to your company, with the date. Buyers looking at that port see your name beside a number instead of a blank space, and requests for quote reach you rather than pass you.
We are not a fuel supplier, trader or broker and take no position in any cargo, so we have no interest in your price other than being right about it. Full detail in the Data & Pricing Policy. Withdraw at any time from the portal, or write to data@bunkerfuelprices.com.