Skip to content

Group Manager Smallholders

GM Portal

Overview

Property Value
Endpoint GET https://api.mspots.org.my/api/groupmanager/list-public
Portal URL https://emspo.org.my/public/group-manager
Total Records ~2,300
Update Frequency Daily
Authentication None (public)

Parameters

Parameter Type Required Default Description
state integer No - Filter by state ID (ignored - returns all)
page integer No 1 Page number (ignored - returns all)
pageSize integer No 10 Records per page (ignored - returns all)

Note: Like other public endpoints, this returns ALL records (~2.3k) in a single response regardless of parameters.

Response Structure

{
  "data": {
    "page_size": "10",
    "results": [
      {
        "entity_smallholder_id": 77890,
        "entity_name": "Greenview Plantations Sdn Bhd",
        "mpob_no": "840560001007",
        "planted_area": "5.0700",
        "certified_area": "5.2600",
        "gps_coordinate_lat": "1.57191667",
        "gps_coordinate_long": "103.98219444",
        "name": "Greenview Plantations Sdn Bhd",
        "stateId": 1,
        "state": "Johor",
        "daerahId": null,
        "daerah": null,
        "mukimId": null,
        "mukim": null,
        "lot_no": "9",
        "cert_status": "DELAYED",
        "zoneId": 5,
        "zone": "Zon Selatan 2",
        "cert_no": "M001C",
        "gm_code": "GRM1086921",
        "created_at": "2025-06-03T04:46:41.581Z",
        "updated_at": "2024-07-24T01:17:06.101Z",
        "track_id": "OPMC205399",
        "record_status": "NO CHANGE",
        "deleted": false
      }
    ]
  }
}

Response Fields

Field Type Description
entity_smallholder_id integer Unique smallholder plot ID
entity_name string Group manager company name
mpob_no string MPOB registration number (12 digits)
planted_area string Total planted area in hectares
certified_area string MSPO certified area in hectares
gps_coordinate_lat string GPS latitude
gps_coordinate_long string GPS longitude
name string Smallholder/company name
stateId integer Malaysian state ID
state string Malaysian state name
daerahId integer/null District ID
daerah string/null District name
mukimId integer/null Mukim ID
mukim string/null Mukim/subdistrict name
lot_no string Land lot number
cert_status string Certification status
zoneId integer MSPO zone ID
zone string MSPO zone name
cert_no string MSPO certificate number
gm_code string Group Manager code (e.g., "GRM278037")
created_at string Record creation timestamp (ISO 8601)
updated_at string Last update timestamp (ISO 8601)
track_id string Tracking ID
record_status string Change status: "NO CHANGE" or "UPDATED"
deleted boolean Soft delete flag

State Distribution

State Records % of Total
Perak 1,585 68.4%
Sabah 727 31.4%
Selangor 3 0.1%
Johor 2 0.1%

Note: Group Manager smallholders are concentrated in Perak (mostly rubber-to-palm conversions) and Sabah.

Difference from SPOC Smallholders

Aspect SPOC (Independent) Group Manager
Records ~306k ~2.3k
Identifier spoc_code gm_code
Management SPOC clusters Private companies
Avg Plot Size ~2-3 ha ~5-20 ha

GCS Storage

gs://calee_data/raw/mspo/api/smallholders/gm/list-public/
└── YYYYMMDD/
    └── list-public.parquet    # ~100KB compressed (zstd)

Example Code

Python

import requests
import polars as pl

def fetch_group_manager_public():
    """Fetch all Group Manager smallholders."""
    url = "https://api.mspots.org.my/api/groupmanager/list-public"

    response = requests.get(url, params={"page": 1, "pageSize": 10}, verify=False)
    response.raise_for_status()

    results = response.json()["data"]["results"]
    print(f"Fetched {len(results):,} records")

    return results

# Fetch and analyze
records = fetch_group_manager_public()
df = pl.DataFrame(records, infer_schema_length=10000)

# Summary by group manager
print(df.group_by("gm_code", "entity_name").agg([
    pl.count().alias("plots"),
    pl.col("certified_area").cast(pl.Float64).sum().alias("total_ha")
]).sort("total_ha", descending=True).head(10))

DuckDB Query

-- Query Group Manager smallholders
SELECT
    gm_code,
    entity_name,
    state,
    COUNT(*) as plots,
    SUM(CAST(certified_area AS DOUBLE)) as total_ha
FROM read_parquet('gs://calee_data/raw/mspo/api/smallholders/gm/list-public/*/*.parquet')
WHERE deleted = false
GROUP BY gm_code, entity_name, state
ORDER BY total_ha DESC;

Data Quality Notes

  1. Concentrated distribution: 99.8% of records are in Perak and Sabah
  2. GM Code format: Prefix "GRM" followed by numbers (e.g., "GRM278037")
  3. Larger plot sizes: Average certified area is higher than SPOC smallholders
  4. Company-managed: Most entries are managed by plantation companies