Browse all documentation

Palmoil FFB price API

Get the latest FFB schedule

Endpoint and request

REST endpoint
GET /v1/commodities/oil-palm-ffb-price
Contract request
curl --request GET \
  --url "https://api.narwhalapi.com/v1/commodities/oil-palm-ffb-price?country=IDN&area=ID-RI&producer_type=smallholder&producer_arrangement=purchase_agreement" \
  --header "Authorization: Bearer $NARWHAL_API_KEY"

MCP uses commodities_get_oil_palm_ffb_price. REST and MCP share the same schema, account quota, rights check, and problem shape.

Parameters

NameRequiredTypeMeaning
countryYesquery · ISO 3166-1 alpha-3Country that owns the official schedule. The first researched country is IDN.
areaNoquery · ISO 3166-2 or Narwhal areaArea such as ID-RI for Riau. Omit only when one series can be selected honestly.
producer_typeYesquery · smallholderGlobal producer vocabulary. The first contract accepts smallholder only.
producer_arrangementNoquery · purchase_agreement or supported_schemeProducer arrangement when the authority distinguishes it.

Response

Contract example
{
  "series_id": "id-ri-oil-palm-ffb-smallholder-purchase-agreement",
  "commodity": "OIL-PALM-FFB",
  "country": "IDN",
  "area": "ID-RI",
  "producer_type": "smallholder",
  "producer_arrangement": "purchase_agreement",
  "price_basis": "official_purchase_schedule",
  "currency": "IDR",
  "unit": "kilogram",
  "effective_from": "2026-08-26",
  "effective_to": "2026-09-01",
  "released_on": "2026-08-26",
  "revision": 1,
  "prices": [
    {
      "tree_age_min_years": 9,
      "tree_age_max_years": 9,
      "price": "3878.72"
    }
  ]
}
FieldTypeRequiredMeaning
series_idstringYesStable physical-series identity.
commodity / country / areastringsYesOIL-PALM-FFB and its exact geographic scope.
producer_type / producer_arrangementstrings or nullYesThe producer scope used by the official schedule.
price_basis / currency / unitstringsYesOfficial purchase schedule, IDR, and kilogram in the first researched slice.
effective_from / effective_to / released_ondatesYesInclusive schedule dates and official release date.
revisionintegerYesWhole-schedule revision number.
pricesarrayYesComplete non-overlapping tree-age bands with decimal-string prices.

Errors and quota

  • 400 invalid_query — a code, area, date range, limit, or selector is invalid.
  • 401 invalid_api_key — the Bearer key is missing or rejected.
  • 404 physical_price_not_found — no complete approved data matches the request.
  • 409 physical_series_ambiguous — the selector matches more than one series.
  • 429 rate_limit_exceeded or quota_exhausted — the shared allowance is exhausted.
  • 503 physical_price_unavailable — a complete publication cannot safely satisfy the Interface.

Rejected requests and server errors do not consume monthly quota.

Coverage

Riau is the first current Adapter. Other areas keep their own historical or validation status.

Public access is not open yet.