Skip to content

Verify a Pass

A hannu Pass is a delegated, one-time credential that confirms an Operator's visit is authorised — verify one at the public POST /v1/pass/verify endpoint. It shows the verifier the Operator's first name, photo, and tier, but never their contact details or government IDs.

Some tasks send an Operator to a place that needs to confirm the visit is legitimate — a building reception, a pickup counter, a gated site. A hannu Pass lets that place confirm the visit is real and authorised, and see just enough to match the person at the door.

What a Pass is

A Pass is a delegated, one-time credential issued for a specific visit. It proves the bearer is a hannu-verified Operator acting under a real task. When verified, it shows the Operator's first name, last initial, photo, and reputation tier, plus the client who sent them — enough to confirm the person on the doorstep. It never exposes the Operator's phone, address, full name, or BVN/NIN — contact details and government IDs are never exposed. It's scoped to one visit and expires.

Verify it

The venue presents the scanned Pass token to the public verification endpoint. POST /v1/pass/verify needs no API key — anyone handed a Pass can confirm it. The token goes in the body field token.

POST/v1/pass/verify
curl -X POST https://api.hannu.africa/v1/pass/verify \
  -H "Authorization: Bearer $HANNU_KEY"

An authorized response confirms the visit and shows who to expect:

{
  "data": {
    "status": "authorized",
    "credential_ref": "cred_7a20",
    "operator": {
      "first_name": "Amara",
      "last_initial": "O",
      "tier": "verified",
      "photo_url": "https://…"
    },
    "sent_by": "Acme Logistics",
    "scope": {
      "action_class": "field_verification",
      "task_title": "Confirm storefront at 23 Commercial Avenue, Yaba",
      "zone_ref": "lagos_yaba"
    },
    "issued_at": "2026-07-17T13:30:00Z",
    "expires_at": "2026-07-17T16:30:00Z",
    "scan_count": 1
  }
}
  • status — authorized when the Pass is genuine, unspent, and unexpired.
  • operator — first name, last initial, photo, and tier, so the verifier can match the person at the door.
  • sent_by — the client who sent the Operator.
  • scope — what the visit is authorized for: action class, task title, and zone.

An expired, revoked, spent, or unknown Pass returns status: "not_authorized" with a reason and no Operator or client details:

{
  "data": {
    "status": "not_authorized",
    "reason": "expired"
  }
}
One-time, then spent

A Pass authenticates a single visit. Once verified and used, it can't be replayed for another. This keeps a leaked or copied token from authorizing a second visit.

Privacy by construction

Verifying a Pass reveals the Operator's first name, photo, and tier, and the client who sent them — enough to confirm the visit — but never their contact details or government IDs. The developer who created the task never sees the Operator's phone or full name either. See how Operators work.

Was this page helpful?