Setup
A new install has nobody who can sign in. These three calls let the dashboard's setup screens fix that. They need no credentials, and they close the moment the install has someone who can sign in: after that, the two POST calls answer 409.
To skip setup, set SENTINEL_BOOTSTRAP_ADMIN_EMAIL and SENTINEL_BOOTSTRAP_ADMIN_PASSWORD instead. See a fresh install.
The two POST calls allow 20 attempts a minute for each client address.
Where setup stands
GET /v1/setupcurl "$SENTINEL_URL/v1/setup"
{ "complete": false, "licence_required": true }
complete is true once someone can sign in, and the dashboard then shows sign-in instead of setup. licence_required is true when the install has a licence key configured (SENTINEL_LICENCE_PUBLIC_KEY). While setup is open, a licence that has already been checked is returned as licence, so a refresh keeps its place.
Check a licence file
POST /v1/setup/licenceOnly when licence_required is true. Send the two fields of the licence file Somu Labs gave you:
{ "payload": "<base64>", "signature": "<base64>" }
The signature is an Ed25519 signature over the decoded payload, and it is checked offline against the public key the install is configured with. Nothing leaves the install.
{
"customer": "Your company Ltd",
"tier": "Growth",
"transactions_per_month": 2000000,
"modules": ["screening", "monitoring", "cases", "reporting"],
"valid_until": "2027-03-31",
"key_id": "ab12cd34"
}
A 400 says why: the file isn't a licence file, the signature doesn't match, or the licence has expired. The licence is kept once it passes.
Create the organisation and its first admin
POST /v1/setup{
"institution": "Your company Ltd",
"licence": "EMI-2026-0142",
"regulator": "Financial Intelligence Centre, Ghana",
"admin_name": "Kofi Mensah",
"admin_email": "kofi.mensah@yourcompany.com",
"admin_password": "a long first password"
}
Saves the organisation's details (they appear on filings) and makes the admin, in one step. The password is 12 to 72 characters, and the admin must replace it when they first sign in. The response is 201 with the admin's email.
| Status | When |
|---|---|
400 | A field is missing or too long, the email isn't one, or the password is the wrong length |
409 | Someone can already sign in, the licence hasn't been checked yet (when one is required), or the email already has an account |