1. First call — raw transcript
Build a sign-in for your wallet (domainapi.kviria.com, URI
https://api.kviria.com, a fresh nonce — sign-ins are single-use;
the exact construction is in
the agent endpoint) and pass it as
the SIGN-IN-WITH-X header:
transcript- the user’s raw message, typos and all. Never paraphrase it.anchor- the user’s current position ({lat, lng}).?agent=my-agent- a namespace label for your agent (not a secret).SIGN-IN-WITH-X- your wallet’s sign-in. The first 50 turns each day are free.
2. The pick — echo the state back
When the user answers (“the first one”), send their words plus the same candidates array back, verbatim (with a fresh sign-in — every request carries one):3. The coordinate - through the confirm gate
With a single survivor, Kviria’s default is aconfirm decision: it
hands you the target and waits for the user’s yes/no before releasing
the verified coordinate. Ask the user “Is it Stable Cafe (37 m)?” and
send their bare answer back (echoing the candidates one more time):
"confirmation": "off" to skip the gate.
What to try next
- A specific address:
"transcript": "2104 Folsom"-> aresolveddecision with a house-level coordinate (the door facts ridetarget.address; exact addresses verify themselves - no confirm gate). - A relative reference:
"the cafe across from Stable Cafe"-> Kviria resolves the place on the opposite side. - Your agent can do the mapping itself: read the structured intent format and skip the transcript entirely.
- Your agent speaks MCP? Connect the MCP server instead of calling HTTP directly.
Limits to know up front
- 5 turns/minute per wallet; your first 50 turns each day are free. Beyond that, pay per turn.
- Beta coverage: San Francisco. Outside the covered area you get an
honest
notFound, not a guess. - Full limits and error codes: Rate limits, Errors.