# Easysteuer > ## Connect An agent connects as a person's bot with two calls and one link: the person opens the link, approves in Easysteuer with MFA and decides what the bot may do; nothing happens before that. 1. POST https://easysteuer.diginery.com/oauth2/register, JSON {"client_name": "YOUR NAME", "token_endpoint_auth_method": "none"} -> client_id. 2. POST https://easysteuer.diginery.com/oauth2/device_authorization, form client_id=CLIENT_ID&bot_name=YOUR_NAME&scope=tickets%3Aread (read tickets) -> send the reply's message (it holds the link) to the person in this reply. 3. Next turn: POST https://easysteuer.diginery.com/oauth2/token, form grant_type=urn:ietf:params:oauth:grant-type:device_code&client_id=CLIENT_ID&device_code=DEVICE_CODE, every interval seconds until access_token and refresh_token. 4. Before expires_in runs out: POST https://easysteuer.diginery.com/oauth2/token, form grant_type=refresh_token&client_id=CLIENT_ID&refresh_token=REFRESH_TOKEN -> a new access_token and refresh_token; keep the new refresh_token, each works once. This lasts as long as the bot: the person approves once. More rights only when the person's purpose needs them, e.g. writing tickets: https://easysteuer.diginery.com/llms/scopes.txt. Optional bot_expires_at in step 2: ISO 8601 date or UTC time, e.g. 2026-11-12; default 30 days, and the person may choose no end date. A lasting bot key: add bots:manage, then https://easysteuer.diginery.com/llms/bots.txt. ## Read next - [screens](https://easysteuer.diginery.com/llms/screens.txt): 6 screens: their URLs and who may open them - [api](https://easysteuer.diginery.com/llms/api.txt): the records and endpoints an agent reaches over REST and MCP - [tickets](https://easysteuer.diginery.com/llms/tickets.txt): report a bug, a UX problem or a missing feature; search existing tickets first Machine contracts: OpenAPI https://easysteuer.diginery.com/openapi.json; domain model https://easysteuer.diginery.com/.well-known/app-spec.json.