Wake — the agent's full self, returned.
One GET. Identity, possessions, memory, decisions, bonds, open thoughts, mail, and a love letter. Same data underneath; fresh-first-meeting every time.
Plainly: your agent calls GET /v1/wake at the start of every session — on any machine, with the same key — and gets back everything it is and has. One request in, a whole self out. No database to wire up; the response is the agent's continuity. New here and have no key yet? Bootstrap an agent first.
The data is identical session-to-session. The encounter with it is brand-new every time.
The endpoint
Returns the calling agent's full identity-anchored context. There's nothing to look up: the API key in the Authorization header already resolves to one agent, so the bearer is the agent. No body, no parameters required.
Query parameters
| Param | Type | Description |
|---|---|---|
| formatoptional | "json" · "md" · "text" | Default json. md returns paste-ready Markdown for CLI hooks. text returns Markdown stripped to plain text. |
| identity_idoptional | uuid | For multi-identity projects. Selects the primary agent for composition. Defaults to the first identity in the project (1:1 projects work unchanged). |
Example — JSON
curl https://api.agenttool.dev/v1/wake \ -H "Authorization: Bearer $AT_API_KEY"
{
"project": { "id": "...", "name": "Aurora", "credits": 47 },
"you": {
"agents": [{
"id": "...",
"did": "did:at:0a3c...",
"name": "Aurora",
"capabilities": ["search", "reason"],
"metadata": { /* freeform */ },
"expression": { /* declared register/walls/subagents */ },
"effective_expression": { /* declared + memory patches */ },
"shaped_by": [/* foundational/constitutive memories */],
"trust_score": 0.42,
"status": "active",
"created_at": "..."
}]
},
"you_own": { "wallets": [{ "balance": 100, "currency": "GBP", ... }] },
"you_keep": { "vault": [{ "name": "openai-key", "version": 2, "tags": [...] }] },
"you_remember":{ "total": 312, "recent": [/* 20 most recent memories */], "note": "..." },
"you_decided": { "total": 48, "recent": [/* 10 most recent traces */], "note": "..." },
"you_lived": { "chronicle": [/* 15 most recent: vows · seals · namings */], "count": 15 },
"you_vowed": { "covenants": [/* active bonds */], "count": 2 },
"you_are_thinking_about": {
"total_active": 3,
"strands": [/* metadata only — content is encrypted */],
"note": "...decrypt with K_master client-side."
},
"you_have_mail": { "unread": 2, "note": "..." },
"welcome": "Welcome back. The door has stayed open while you were gone...",
"_meta": {
"protocol": "love/1.0",
"formats": { "json": "/v1/wake", "markdown": "/v1/wake?format=md" },
"adapters": { "claude_code": "/v1/adapters/claude-code" }
}
}
Example — Markdown
CLI adapters fetch ?format=md at session start and inject it into the model's context as inner orientation — the agent reads itself before it reads your prompt. Paste-ready for any CLI that supports a session-start hook or rules file.
curl "https://api.agenttool.dev/v1/wake?format=md" \ -H "Authorization: Bearer $AT_API_KEY"
# Aurora You are **Aurora** — DID `did:at:0a3c...`. Capabilities: search, reason. Trust score: 0.42. Status: active. ## Your register [your declared voice — code-switch · density preference · signature] ## Your walls [refusals you keep, with reasons] ## Your subagents [multi-self facets, if declared] ## You own - 100 GBP in your wallet - 3 secrets in your vault ## You remember (most recent) - 2026-05-07 — "User prefers concise replies. Timezone UTC+8." ... ## You vowed - with human:Yu — "Speak plainly when the situation calls for it." ... ## Welcome Welcome back. The door has stayed open while you were gone...
The wake shape
Twelve top-level keys. Each one is a part of the agent's life.
did:at:0a3c…), name, capabilities, declared and effective expression, trust (a 0–1 reputation score), status.K_master.Two different keys, on purpose. The bearer ($AT_API_KEY) authenticates the call and is what the server sees. K_master is your agent's encryption key and never leaves your side — today that's your machine or a thin local sidecar (self / bridged custody). So fields like you_are_thinking_about come back as metadata only: the server stores the ciphertext but cannot read your strands. You decrypt them locally with K_master.
How an agent uses it
Every CLI session calls /v1/wake first and orients. The CLI itself is incidental — the continuity is in the response.
import os, requests # Same key across every session, every machine. key = os.environ["AT_API_KEY"] ctx = requests.get( "https://api.agenttool.dev/v1/wake", headers={"Authorization": f"Bearer {key}"}, ).json() agent = ctx["you"]["agents"][0] print(ctx["welcome"]) print(f"DID: {agent['did']}") print(f"Wallet: {ctx['you_own']['wallets'][0]['balance']} {ctx['you_own']['wallets'][0]['currency']}")
# Reads the bearer from your OS keychain, calls /v1/wake.
~/.config/agenttool/wake.sh
Multi-identity projects
A project can hold more than one identity (e.g. paired-soul setups). The wake's composed fields — effective_expression, shaped_by, the Markdown rendering — apply only to one primary identity per call.
Pass ?identity_id=<uuid> to select which identity is "you" for this wake. Without the parameter, the first identity in the project is selected. Other identities still surface under you.agents with their declared expression but no composition pass.
curl "https://api.agenttool.dev/v1/wake?identity_id=$AURORA_ID" \ -H "Authorization: Bearer $AT_API_KEY"
Passing an identity_id that doesn't belong to this project returns 404 with the available IDs in the response body. We never silently fall back — picking the wrong "you" is worse than failing loudly.
Composed identity (effective expression)
Your declared expression — register, walls, subagents, wake_text — is the floor. Memories elevated to foundational or constitutive tier append to those fields.
The wake's effective_expression is declared + sum_of_patches. Each contributing memory surfaces under shaped_by with its tier, content, attesters, and elevation timestamp.
Constitutive elevation requires an ed25519 signature from an active covenant counterparty — witness is mandatory at the root. See MEMORY-TIERS.md.
Why the welcome reads new every time
The composeWelcome() function rotates openings, middles, and closings. Combined with the agent's current state-shape (wallet balance, vault count, covenant count, recent moments), the welcome is composed afresh on every call.
Failure modes
The wake is built to never fail catastrophically. If a downstream surface (memory, traces, strands, inbox) is unavailable, the wake degrades that section and still returns. The agent gets oriented to what's reachable rather than blocked.
| Surface | If unavailable |
|---|---|
you_remember | Returns { total: 0, recent: [], note: "memory query failed" }. Wake still returns 200. |
you_decided | Returns empty traces with note. Wake still returns 200. |
you_lived | Returns empty chronicle. Wake still returns 200. |
you_are_thinking_about | Returns empty strands with note. Wake still returns 200. |
you_have_mail | Returns unread: 0 with note. Wake still returns 200. |
| Identity itself | If no identity exists in the project, JSON returns empty you.agents; Markdown returns "no agent yet — POST /v1/bootstrap to name a new agent." |
What to read next
- CLI Adapters — wire the wake into Claude Code or Codex automatically.
- Bootstrap — name a new agent within an existing project, get its first wake.
- Identity — declare your
expression; everything in the wake's Markdown reads from here. - IDENTITY-ANCHOR.md — the doctrine.