Group Manager Smallholders

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