Codes, never names
Every answer is a PSGC code, not a string match. Names repeat by the hundreds across the archipelago; codes don't. That single rule removes the failure class that breaks PH geocoding.
85 provinces · Makati marked
33 barangays · the level FMIS resolves to
/v1/geocode call — generated by
scripts/build_landing_map.py, not traced. Still no map tiles
and no third-party requests. The national panel is simplified to the pixel
and omits islands smaller than one pixel, including the 0.3 km²
Kalayaan group at 114.3°E — the API resolves them; this picture cannot
draw them. The Makati panel drops nothing: all 33 barangays are there.PSGC-aligned administrative data with PSA/NAMRIA boundary geometry. Every data artifact ships with its lineage — the git SHA and checksums of what produced it — because "which vintage answered this?" should never be a mystery.
Philippine-first geocoding & routing API
FMIS resolves free-text Philippine addresses to PSGC codes — region, province, city, barangay — with calibrated confidence, an execution trace, and a typed outcome for every request. When six municipalities share a name, it doesn't gamble. It refuses, and tells you what would settle it.
Accuracy counts every address — including the ones we refuse rather than guess — as a miss. When we do answer, city precision is 99.82%. Measured on a 45,695-address benchmark with synthetic address text; real-world messy input is not yet measured. We publish the method with the number — how we measure.
"admin_areas": [
{ "code": "034903002", "name": "Aduas Centro" },
{ "code": "034903000", "name": "Cabanatuan City" }
],
"outcome": "resolved",
"confidence": 0.95,
"claim_level": { "level": 4, "label": "barangay" },
"boundary_risk": {
"distance_to_edge_m": 165.0, "at_risk": false
},
"escalation": "none",
"trace": [ 4 stages · 3.4 µs ]
Every answer is a PSGC code, not a string match. Names repeat by the hundreds across the archipelago; codes don't. That single rule removes the failure class that breaks PH geocoding.
An ambiguous address returns the candidate list and what would disambiguate it — never a confident coin-flip. A wrong answer costs a failed delivery; a refusal costs one clarifying question.
Each response carries its execution trace and a geometry check: how far the point sits from the edge of the area it claims. Claims near a boundary say so before dispatch, not after a dispute.
Motorcycle-profile routing tuned for Philippine streets — tollways excluded for <400cc, alley-aware — with ETAs that state their assumptions instead of hiding them.
No nulls to interpret, no guessing what a 200 means. Every response lands in the same envelope with five questions answered:
resolved · partially_resolved ·
unresolved — an unresolved answer is a valid answer,
returned as one, not disguised as an error.
Two separate axes: how likely the claim is right, and how specific it dares to be. Dispatch can demand both; analytics can accept less.
Who can unstick this — none, ask the
user for a pin, or an operator data gap.
Your app always knows the next move.
One real address, resolved by FMIS: Argos Street, Valle Cruz,
Cabanatuan City. Everything drawn here is FMIS's own data — the
barangay boundary, the named street, and the two points.
The gap is 913 metres. That is the difference between a rider arriving and a rider calling.
There are six municipalities named Burgos in the Philippines. A geocoder that returns one of them with 95% confidence is right one time in six — and your rider finds out which time, at the gate, with the customer on the phone.
FMIS returns the six candidates, each with its province, and asks for the one fact that settles it. In benchmark, that honesty converts over a thousand confidently-wrong answers into precise questions.
Ambiguity is resolved by information — a province, a landmark, a confirmed pin — never by a model's opinion.
"outcome": "unresolved",
"reason": "ambiguous_admin_area",
"escalation": "user_input",
"ambiguous": {
"name": "Burgos", "candidates": 6,
"options": [
{ "name": "Burgos", "parent": "Ilocos Norte" },
{ "name": "Burgos", "parent": "Ilocos Sur" },
{ "name": "Burgos", "parent": "La Union" },
… 3 more
]
}
Two questions have two different answers, and most geocoders quote you the flattering one. We report both, side by side.
All figures are on a frozen 45,695-address benchmark whose address text is synthetic — generated from the same PSGC data the resolver reads, so it flatters us. Real-world messy input (landmark-only, misspelled, informal) is not yet measured; a field benchmark against independently-verified addresses is in progress. We would rather show you the honest denominator than a number measured on our home turf.
No SDK, no client library, no map tiles to load. One POST, one typed envelope back.
If your form already separates city and barangay, keep them separate. Structured input scores 100%; the same fields joined into one string score 6.6%.
outcome firstThree values, not an exception. unresolved is a
200 — a valid answer that names what would settle it.
Send the customer pin too and FMIS cross-examines it against the
address. match means dispatch on the pin.
curl -X POST https://api.fmis.world/v1/geocode \
-H "Authorization: Bearer $FMIS_KEY" \
-H "content-type: application/json" \
-d '{
"components": {
"admin_codes": { "city": "034903000", "barangay": "034903083" },
"line1": "123 Argos Street"
},
"customer_pin": { "lat": 15.4724, "lng": 120.98729 }
}'
13 endpoints, all documented. Geocode, reverse, route, ETA, dispatch, batch, telemetry, and the administrative hierarchy — request a key for the full integration guide.
A comparison that names its own losses is the only kind worth reading.
| Capability | FMIS | Mapbox | Nominatim | |
|---|---|---|---|---|
| PSGC codes returned | every response | no | no | no |
| Refuses when ambiguous | typed unresolved | best guess | ranked guess | ranked guess |
| Execution trace per call | every response | no | no | no |
| Boundary-risk geometry | distance to edge | no | no | no |
| Barangay-level coverage | 42,046 | partial | partial | partial |
| Motorcycle profile, <400cc rules | yes, tollway-aware | no | no | n/a |
| Global coverage | Philippines only | worldwide | worldwide | worldwide |
| House-number precision | street level | rooftop | rooftop | varies |
| Autocomplete-as-you-type | not yet | yes | yes | no |
Two honest losses. FMIS is Philippines-only, and no PH dataset maps house numbers to coordinates — best case is the correct street. If you need rooftop precision worldwide, buy Google. If you need a Philippine address resolved to a code you can price and dispatch on, that is what this is for.
Global providers charge for worldwide coverage you will not use. Google is the accuracy benchmark at $5 per 1,000 requests; FMIS is one country, resolved properly, for less.
$0
1,000 requests / day
$49/mo
1,200 req / min / key
$199/mo
5,000 req / min ceiling
Talk
negotiated
What we will not promise yet. There is no uptime SLA while this is a one-person operation — design partners get best-effort terms, stated plainly, rather than a number we cannot honour. Prices are indicative and being validated with the first cohort; if you are in it, they will not move under you.
FMIS is in production for its first logistics customer. A small number of additional PH logistics teams will be onboarded while the public tier is built.
questara.support@gmail.comAPI-first · keyed access · no consumer app — FMIS powers yours.