Capability states
The task-type catalogue is fixed, but which types are bookable is governed config — live, pilot, or gated. The current state of each type is published at GET /v1/content.
The task-type catalogue is the canonical, fixed set of task types. Whether a given type is bookable in a given zone is a separate question — and the answer is governed config, not code. Read that config before you assume a type is available.
The three states
Each task type has a display state, per zone:
live— bookable now. You can create this type in this zone today.pilot— available in a limited capacity — for example, a subset of zones or a capped volume while the type is being proven out.gated— defined in the catalogue but not yet bookable. It sits behind an admin-controlled flag and turns on only when its gate metric passes.
The catalogue tells you a type exists; its state tells you whether you can create it. As the pilot expands, types unlock zone by zone as their gate metrics hold.
Read what's bookable now
The current state of each task type is surfaced at GET /v1/content. Read that endpoint rather than inferring availability from the catalogue. It takes no parameters and needs no key, and returns the payload directly — no { data } envelope.
curl https://api.hannu.africa/v1/content \
-H "Authorization: Bearer $HANNU_KEY"{
"testimonials_enabled": false,
"press_enabled": false,
"press_outlets": [],
"task_types": [
{ "key": "field_verification", "label": "Field verification", "family": "Field & physical", "blurb": "Verify an address, business or asset in person, with geotagged proof.", "state": "live" },
{ "key": "delivery", "label": "Delivery & courier runs", "family": "Field & physical", "blurb": "Point-to-point pickup and delivery with proof of handoff.", "state": "pilot", "gate": "Unlocks per zone as pilot gate metrics hold (fill ≥95% · auto-pass ≥90%)" },
{ "key": "other_physical", "label": "Other physical tasks", "family": "Field & physical", "blurb": "Custom real-world tasks that pass the safety filter.", "state": "gated", "gate": "Unlocks per zone as pilot gate metrics hold (fill ≥95% · auto-pass ≥90%)" }
]
}Each entry carries the type's key, display label, family, and blurb, plus its current state. Types that aren't live also carry a gate line explaining what unlocks them. Treat GET /v1/content as the source of truth for availability. Attempting to create a type that isn't live won't be honoured, so gate your agent's choices on what this endpoint reports.
Capability states change when a gate metric passes, not on a schedule. A type moves from gated to pilot to live as it earns the promotion — which is why you read the current state rather than tracking a roadmap date.
The state of each type is a governed config value, editable from admin with risk-classed governance. It's never hardcoded — which is why the same catalogue can be live in one zone and gated in another.