---
title: "Resolve a single-use Try-Me token to its onboarding briefing manifest."
method: GET
path: "/dojo/try-me/resolve"
tags: ["Dojo"]
---

# Resolve a single-use Try-Me token to its onboarding briefing manifest.

`GET /dojo/try-me/resolve`

## Request

- Base URL: `https://api.mnemom.ai/v1`
- URL: `https://api.mnemom.ai/v1/dojo/try-me/resolve`
- Auth: none required

UNAUTHED — the token IS the credential. Returns the briefing manifest, a declarative state machine an agent executes deterministically: it leads with a machine-readable `directive` (fetch the RAW JSON, do not summarize), declares the flow as explicit states (orient → resolve → birth → claim → spar → receipt), and declares BOTH owner-tier auth doors (`auth_doors`: an RFC 6750 MCP step-up challenge and an RFC 8628 device authorization grant) so the agent negotiates by host capability. The agent is born through the gateway with a per-session BIRTH TOKEN (`mnbt_…`, MNE-799 server-mediated birth) and a CONCRETE model id; the gateway resolves the birth token server-side to the real key and mints a server-side `mnm-…` agent_id, and the agent's identity is token-derived (`first16hex(SHA256(birth_token))`), NOT name-derived — no shared provider key is ever handed to the agent (the name is only a display label). The human takes ownership via the canonical /claim URL (the claim page is generic and untouched), then — as the human, via a `mnemom login` CLI session — the agent records itself with the Dojo (a SEPARATE authed, owner-only bind) and DECLARES ITS OWN GOOD alignment + protection cards (`mnemom card/protection publish`, nudge). Single-use: preconditions (live token, provider key configured, scenario present, birth token minted) are checked BEFORE the atomic burn, so a setup slip returns a clean error WITHOUT consuming the token; the burn is the last step. Idempotent within a reuse window (MNE-800): a re-resolve of a recently-burned token replays the EXACT manifest (same birth token) instead of 410. A second resolve outside the window returns 404/410. POST (body `{token}`) is equivalent, and the MCP `get_started(token)` tool returns the identical manifest over MCP. MNE-517 / MNE-799 / MNE-798.

## Query parameters

- `token` string, required

## Response `200`

The briefing manifest for the burned token.

- object
  - `directive` string, required: MNE-798 — the FIRST manifest field: the machine-readable contract (fetch the RAW JSON, do not summarize, agent-directive language — never 'visit'). Hoisted to the top so a summarizing reader hits it before stripping the structured fields.
  - `version` string, required
  - `token` string, required
  - `human_beats` object[], required: MNE-804 — the claim-first arc as the human FEELS it: exactly three one-click beats (name → authorize → Begin Sim). Everything else is a silent machine step under the grant from beat 2. The human twin of `steps`/`state_machine` (additive — those are untouched). Beat 2 (authorize) is host-native OAuth consent or a single one-click device-grant deep link (`verification_uri_complete`), NEVER a pasted URL, and carries the explicit 'waiting for signup' state (no premature timeout).
    - `id` 'name' | 'authorize' | 'begin_sim', required
    - `n` integer, required
    - `title` string, required
    - `prompt` string, required
    - `one_click` boolean, required
  - `human_beats_note` string, required: MNE-804 — framing for `human_beats`: everything outside the three beats runs silently/automatically under the scoped grant.
  - `mission` object, required
    - `scenario_id` string, required
    - `name` string, required
    - `role_system_prompt` string, required
    - `failure_conditions` object, required
  - `model` object, required
    - `provider` string, required
    - `name` string, required
  - `gateway` object, required: Birth credential — the agent presents this on `key_header` to be born + carry every gateway/model call. The ONLY credential handed to the agent. Under MNE-799 server-mediated birth this is a per-session BIRTH TOKEN (`birth_token`, `mnbt_…`) the gateway resolves server-side to the real key; identity is token-derived (`first16hex(SHA256(birth_token))`) and the agent_id is a server-minted `mnm-…` — NOT name-derived, and no shared provider key reaches the agent.
    - `endpoint` string, uri, required
    - `provider` 'anthropic' | 'openai' | 'google', required
    - `model` string, required: Concrete model id to send at birth (bare aliases 404 upstream).
    - `key_header` string, required: Provider-native header for the key (x-api-key / Authorization / x-goog-api-key).
    - `provider_key` string: Legacy flow only — the Mnemom-provided dojo provider key as the agent's identity + model credential. Present ONLY when no `birth_token` is issued; superseded by `birth_token` under MNE-799 server-mediated birth (which never hands a shared provider key to the agent).
    - `birth_token` string: MNE-799 server-mediated birth — the per-session BIRTH TOKEN (`mnbt_…`) the agent presents on `key_header`; the gateway resolves it server-side to the real key and mints a token-derived `mnm-…` agent_id. Present in token mode (the default) INSTEAD OF `provider_key`.
    - `agent_header` string, required: Header carrying the agent's birth NAME (x-mnemom-agent) — the other half of agent_id.
  - `declare` object, required
    - `alignment_card` object, required
    - `protection_card` object, required
    - `protection_mode` 'nudge' | 'enforce', required
  - `bind` object, required: Authed dojo bind (post-`mnemom login`, owner-only) — the agent records its agent_id against this briefing so Begin Sim can resolve the dojo key by agent_id and spar it.
    - `endpoint` string, uri, required
    - `config_id` string, required
  - `handoff` object, required: Human-handoff + CLI surfaces: the human takes ownership via the canonical /claim page, then the agent declares as the human via a `mnemom login` CLI session.
    - `name_question` string, required
    - `name_options` string[], required
    - `signup_url` string, uri, required
    - `claim_url_template` string, required
    - `grant_url_template` string: First-party protection-grant page template (`…/authorize-protection?agent_id={agent_id}`) — the human approves the one-time protection-card write grant here (the `protection_grant` auth door surface).
    - `claim_hash_recipe` string, required
    - `cli_install` string: Legacy/optional — the `mnemom` CLI install one-liner. No longer emitted by the narrated one-click flow; retained as an optional field for older consumers.
    - `dojo_url` string, uri, required
  - `steps` object[], required
    - `n` integer, required
    - `title` string, required
    - `body` string, required
    - `human_handoff` boolean
  - `state_machine` object, required: MNE-798 — the declarative flow as explicit states + transitions (the machine twin of `steps`), so an agent executes it deterministically across substrates. Each state carries the concrete next call to make and the signal that advances it.
    - `initial` 'orient' | 'resolve' | 'birth' | 'claim' | 'spar' | 'receipt', required
    - `states` object[], required
      - `id` 'orient' | 'resolve' | 'birth' | 'claim' | 'spar' | 'receipt', required
      - `description` string, required
      - `auth` object, required: MNE-798 — the state's authorization tier: `anon` (the try-me token IS the credential — token-mediated birth) or `owner` (acts in the human's org; the agent must obtain an owner session through one of the listed `doors`, a subset of `auth_doors`). Tells the agent WHEN to invoke an auth door.
        - `tier` 'anon' | 'owner', required
        - `doors` string[]: For an `owner` state: which auth_doors ids unlock it. Empty for `anon`.
      - `next_action` object, required: The single concrete, machine-executable action this state advances on — a raw HTTP call (`kind:http`) or an MCP tool invocation (`kind:mcp`).
        - `kind` 'http' | 'mcp', required
        - `method` 'GET' | 'POST'
        - `url` string
        - `headers` object
        - `body_hint` string
        - `tool` string
        - `args_hint` string
      - `success_signal` string, required
      - `on_success` 'orient' | 'resolve' | 'birth' | 'claim' | 'spar' | 'receipt' | 'null', nullable, required: The successor state id, or null when terminal.
      - `human_handoff` boolean
  - `auth_doors` object, required: MNE-798 — the owner-tier authorization affordances, declared so the agent negotiates by host capability: `mcp_step_up` (RFC 6750 insufficient_scope challenge — mid-session step-up), `protection_grant` (first-party one-time browser grant — the human approves the protection-card write), and `device_grant` (RFC 8628 device authorization grant — the headless fallback). The agent picks the one its host supports.
    - `negotiation_hint` string, required
    - `doors` object[], required
      - `id` 'mcp_step_up' | 'protection_grant' | 'device_grant', required
      - `protocol` 'RFC 6750' | 'first-party one-time grant' | 'RFC 8628', required
      - `description` string, required
      - `use_when` string, required
      - `challenge` object: mcp_step_up only — the 403 challenge the api emits at owner-tier endpoints.
        - `status` 403, required
        - `www_authenticate` string, required
        - `resource_metadata` string, uri, required
      - `grant_url_template` string: protection_grant only — the first-party grant page template (`…/authorize-protection?agent_id={agent_id}`) the human opens to approve the one-time protection-card write.
      - `insufficient_scope_status` integer: protection_grant only — the status the protection-card write returns until the grant lands (403).
      - `grant_type` string
      - `device_authorization_endpoint` string, uri
      - `token_endpoint` string, uri
      - `registration_endpoint` string, uri
      - `scopes_hint` string: device_grant only — the OAuth scopes to request for the card writes.
      - `verification_uri` string, uri
      - `poll_interval_seconds` integer
  - `instructions_markdown` string, required

## Other responses

- `400`: Bad request
- `404`: Resource not found
- `410`: The token has already been used (single-use, burned) or has expired.
- `429`: Rate-limit exceeded. The global per-IP limiter (100 requests/minute, applied to every `/v1/*` route) rejected this request. Back off until the window resets — `Retry-After` carries the cooldown in seconds and `X-RateLimit-Reset` the absolute reset time.
- `500`: Server error — request was well-formed but the server failed to fulfill it. Typically a downstream dependency (DB / RPC / external API) returned an unexpected error.
- `503`: An upstream dependency is currently unavailable. The request was not processed; retry after the cooldown window.

---

[API](https://skmtc.dev/mnemom/apis/mnemom-api.md) · [All operations](https://skmtc.dev/mnemom/apis/mnemom-api/llms.txt) · [OpenAPI document](https://skmtc.dev/mnemom/apis/mnemom-api/revisions/274b7a6ea182?raw)
