> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://apidocs.sare.africa/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://apidocs.sare.africa/_mcp/server.

# Overview

Complete endpoint documentation for the Sare Core API (`/api/v3`).

**Structure**: one top-level folder per Spring Modulith module (`Wallet`, `Identity`, `Location`, `Integrations`, `Notifications`, `Ussd`, `Waas` - matching `io.sare.sare_core.*` in CLAUDE.md), each containing one subfolder per controller/feature area. **Keep this pattern going forward**: a new endpoint nests under its module's top-level folder, in a new or existing subfolder named after its controller/feature - never as a new top-level folder.

**Envelope**: success responses wrap the payload as `{ "code": int, "message": string, "data": T }` (`data` omitted when null). Errors are `{ "status": int, "message": string, "path": string }` (plus `stackTrace` if the server has `sare.stack.trace=true`).

**Auth**: most endpoints need `Authorization: Bearer {{accessToken}}` (set after calling Login, under Identity > Auth). A request-signing filter also requires `X-Device-Id`/`X-Signature`/`X-Timestamp`/`X-Request-Id` headers on non-GET requests to non-public paths (skipped for GET requests, multipart requests, the `local` profile, and the whitelisted paths noted per-subfolder below) - included as disabled headers on relevant requests here since they require a real device keypair to compute correctly; set them via a pre-request script if you need to exercise that filter.

**Fully public** (no Bearer token at all): `payments/**`, `auth/**` (except `auth/logout`/`auth/refresh-token`), `areas/**`, `counties/**`, `regions/**`, `wallets/register/**`, `waas/callbacks/choicebaas`, `devices/**`, `wallet/ussd/**`, `geolocation/reverse-geocode`, `users/appVersion`.

Set the `baseUrl` collection variable to your target environment (default `http://localhost:8080/api/v3`).