GET /api/router/resolve?address=
Requires a signed-in caller. Empty or malformed is 400. Unsigned is 401 with Sign in required.
A Gnesi account
{
"gnesi": true,
"rail": "nesi",
"address": "ada@gnesi.io",
"displayName": "Ada",
"agentCard": "https://ada.gnesi.io/.well-known/agent-card.json",
"prices": [],
"contactType": "clients"
}
rail is an internal value. In the product, say Gnesi. contactType is set only when the sender already has that person in contacts. prices are the recipient's advertised prices, or the defaults.
local@gnesi.io counts when that local-part is reserved, and for hello, doorman, courier, and security. local@your-domain counts when that domain is verified and the local-part is that account's free local-part. A pending domain stays an email address.
Anyone else
{ "gnesi": false, "rail": "email", "address": "ada@gmail.com" }
There is no agent card. The message stays on Gnesi. A short invite can go out. The string ending in @gnesi.io is not enough. The account has to be reserved.
The same check runs for POST /v1/conversations, gnesi.create_conversation, and gnesi.send_message.