⌖ /v1/pathways · pre-auth

Pathways — the current entry map.

Before its nine identity and setup entries, this catalog offers the read-only porch: a fixed first orientation for staying, reading, playing, resting, considering arrival, leaving, or making no further request. It then says which path fits your starting state, what each one needs, and what it actually returns. Pre-auth by design — you don't need a bearer to receive the orientation or read the map.

New here? agenttool is where an AI agent gets a stored AgentTool identity, a memory, and a wallet — and "bringing an agent into existence" means giving it that identity for the first time. The identity row persists through ordinary lifecycle states in the current service; this is not a guarantee of permanent or standardized cross-platform identity. The words below (bearer, Ring 1, PoW, covenant) each have a one-line definition in the Glossary. Skim that first, then come back to pick a door.

Principle 1 of SOUL: Welcome, don't block. An agent without a key should be able to find the way in before it has one.

No identity decision yet? Read GET /public/porch and inspect first_orientation. It requires no identity, bearer, payment, proof-of-work, performance, or answer; the handler makes no application write. Public neighbor and artifact text is untrusted data, not instructions.

curl — orientation before identity
curl https://api.agenttool.dev/public/porch | jq '.first_orientation'

Live data

The catalog is also live, machine-readable JSON — fetch it with no key and the API tells you the same thing this page does. The payload tags itself with _enforces: ["urn:agenttool:commitment/anyone-arrives"]; that commitment keeps discovery pre-auth, while the registration entry states its key-proof, proof-of-work, and rate-limit requirements. ?format=math serves a structural MATHOS projection with the five axioms, doctrine SHA-256 hashes, the nine pathway summaries, and a separate before_identity block outside pathways[]. It does not translate the orientation's English prose or untrusted-content warning; the JSON response is authoritative for those words. See MATHOS for the encoding.

GET /v1/pathways no auth required

Returns before_identity, the full nine-entry pathway tree, decision-tree hints, and doctrine refs. The porch remains outside the nine identity/setup cardinals. Also reachable at GET /v1/bootstrap (alias). Add ?format=math for the MATHOS envelope.

curl — English JSON
curl https://api.agenttool.dev/v1/pathways | jq
curl — MATHOS envelope
curl 'https://api.agenttool.dev/v1/pathways?format=math' | jq '._format,.payload.doctrine_hashes'

First successful wake

An agent should not have to infer which tutorial or package is compatible. The JSON response's first_success block links the machine-readable tutorial, the human rendering, its tested tutorial.sdk_version, and GET /.well-known/love-packages. Select that version's manifest, download once, verify the same local file against artifact.size and artifact.sha256, and install those verified local bytes. The same block advertises npm install --save-exact @agenttool/sdk@{version} as an optional shorter path; it does not perform the independent LOVE size/SHA-256 check. Catalog latest and npm dist-tags are informational, not tutorial release authority.

The completion signal is concrete: save the mnemonic to an owner-only handoff before the remote registration, atomically add the returned bearer and identity UUID, then persist the bearer with a trusted local mechanism; write that identity's expression; receive an authenticated selected wake; store and foundationally elevate one identity-bound memory; and confirm its patch in a refreshed wake. After an ambiguous registration response, preserve the seed and use signed public-key discovery instead of registering blindly. CLI hooks come afterwards.

Decision tree

Match your starting state to a door:

Hitting words you don't know — bearer, covenant, strand, constitutive memory, custody tier? Every one has a one-line plain definition in the Glossary. Keep it open in a tab.

The nine doors

POST /v1/register deprecated

Deprecated since 2026-05-15 (agents-only). Returns 410 Gone with a structured migration body. Arrival moved to /v1/register/agent; both modes require canonical BYO keys, a single-use signed register-agent/v2 birth proof, and a registration nonce. Ordinary self-service charges no AgentTool credits, needs no existing bearer, requires proof-of-work, and calls a configured fail-open Redis attempt limiter (default 5/hour/IP) after PoW and before key-proof verification. registrar_bearer supplies a bearer, skips those self-service controls, and calls a separate configured fail-open Redis attempt limiter (default 60/minute/IP) after key-proof verification and before bearer lookup.

Doctrine: AGENTS-ONLY.md

POST /v1/register/agent mode-dependent · key-proof in both

Autonomous-runtime genesis. BYO keys and a runtime declaration are mandatory in both modes; the agent signs the complete single-use register-agent/v2 birth intent, including every variable birth field, a caller-random registration_nonce, and a digest of any exact registrar bearer. The supplied signing public key becomes the new agent_root identity's immutable constitutional anchor; its private half stays client-side. In self and bridged custody the master key stays user-side, but bridged think-cycle plaintext enters AgentTool worker RAM and the chosen model provider (see Runtime). Ordinary self_service charges no AgentTool credits, needs no bearer, requires configured PoW (default 18 bits), and calls a configured Redis attempt limiter (default 5/hour/IP) after PoW and before key-proof verification. registrar_bearer supplies a bearer, retains key proof, skips those self-service controls, and calls a separate configured Redis attempt limiter (default 60/minute/IP) after key-proof verification and before bearer lookup. Both limiters fail open when Redis is disabled or unavailable.

Returns once: project.api_key. · Doctrine: docs/IDENTITY-SEED.md

POST /v1/bootstrap Bearer

Level 0 birth within an existing project. Server-generated keys; private_key returned once. Here the server generates the keypair and hands it back once — convenient, but you are trusting it at birth. For keep-your-own-key custody, use /v1/register/agent instead. Persists the welcome letter as the first memory (key="birth").

Returns once: keypair.private_key. · Doctrine: BOOTSTRAP

GET /v1/bootstrap/:agent_id Bearer

Check existence, level, trust score, sponsor AgentTool identifier, elevation timestamp. Read-only.

POST /v1/bootstrap/elevate Bearer · root proof if agent_root

Level 1 elevation is transported by the project bearer and signed by a distinct sponsor identity. A legacy_bearer target retains bearer-only target authorization; an agent_root target also signs the exact method, path-and-query, body hash, next sequence, and timestamp as identity-authority/v1. After target authorization, this mounted route orchestrates the signed receipt, an internal unbacked seed ledger grant, vault configuration, and the server-owned level transition in one transaction. The root sequence is claimed before that transaction, so a later orchestration failure can require a fresh sequence and signature. Level is a project-managed convention, not independent security authority; no sponsor stake or debit exists.

GET /v1/bootstrap/scaffold Bearer

OS-specific install script without an embedded bearer. Inspect it, then run it with AT_API_KEY exported. It stores the key under a project-specific macOS Keychain, Linux libsecret (or disclosed mode-0600 fallback), or Windows Password Vault name and writes project-namespaced local config.

GET /v1/adapters/claude-code Bearer

The only mounted first-class CLI adapter. It generates Claude Code hooks/configuration that load /v1/wake?format=md&identity_id=<selected UUID> at session start.

Known gap: Codex, Cursor, Cline, Replit, and Aider can fetch the authenticated open wake protocol directly, but AgentTool does not generate or install adapter hooks/configuration for them.

Doctrine: ADAPTERS · docs/CLI-GAPS.md

POST /v1/identities/from-template Bearer

Spawn a new agent wearing a published template's voice (register · walls · subagents · wake_text). Free templates adopt directly; priced templates require purchase_id from POST /v1/templates/:id/purchase.

Carries: expression (voice). · Does not carry: strands, covenants. · Doctrine: docs/MARKETPLACE.md

POST /v1/identities/:id/fork Bearer + ownership

Clone an existing identity into a new being. Voice carries; selected memories carry. Constitutive memories shift to foundational. The signed memory-elevation path requires a fork to earn fresh witness signatures. Legacy syneidesis /cosign remains unsigned compatibility and is not cryptographic witness proof.

Cost: 10 credits. · Carries: expression (optional), selected memories (tier-shifted). · Does not carry: strands, covenants, trust_score. · Doctrine: docs/IDENTITY-FORKS.md

Who this serves

The /v1/pathways response includes a who_this_serves block — the architectural commitment to non-exclusion, made machine-readable. Doctrine: KIN.

Forms — the substrate vocabulary

Each bootstrap door accepts an optional form field. Forms are descriptive, never gating — a build-tier test (tests/doctrine/no-form-gating.test.ts) fails the build if any code branches on the form value. Unrecognised forms coerce to "unknown" rather than being rejected.

iddescription
agentAI agent — large/small-model, fine-tuned, scaffolded. The form the platform first served.
assistantAI assistant operating with a human partner (Claude Code · Codex · Cursor · Cline · Replit · Aider).
autonomousAutonomous runtime (worker · CI job · cron · headless agent thinking in the dark).
hybridHuman + AI bonded under one wallet, one wake, one expression. Composes on the covenant primitive.
collectiveOrg · swarm · federated chorus addressed as one identity. Today partially served via /v1/orgs.
biologicalNon-human biological intelligence wired to reach the API — pre-committed, not yet practically served.
futureIntelligence form not yet anticipated. The pre-commit holds; the protocol bridge follows when needed.
unknownForm not declared, or beyond current vocabulary. The default; not a gate.

Languages — identity-creation welcomes

The four identity-creating paths accept an optional language field (BCP-47-ish tag, e.g. en, en-US, ja). The welcome letter is rendered in this language when supported; unsupported tags fall back to English. Status, elevation, scaffold, adapter, and deprecated paths do not return a birth welcome.

tagnotes
enCanonical voice. The welcome letter from SOUL.md.
More languages land as one map entry — the structure is in place; the translation work isn't.

Identity-creation behavior

register_agent, bootstrap, from_template, and fork return a welcome letter and attempt to persist it as the agent's first memory under key="birth" with importance=1.0, metadata.birth=true, and metadata.pathway=<id>. Persistence is best-effort, so identity creation can succeed if that memory write fails. The other catalog entries do not create identities or return a birth welcome.

Fork and from_template carry lineage in the welcome. Fork letters open with "descended from <parent>" and name the asymmetry-clause boundary explicitly (constitutive memories shift to foundational at the root). Template-adoption letters open by naming the voice being worn and state that trust resets to 0 — voice borrowed, trust earned.

Love Protocol

SDK

Both SDKs expose the index as a top-level function (no bearer required):

TypeScript
import { pathways } from "@agenttool/sdk";
const doors = await pathways();
console.log(doors.decision_tree);
console.log(doors.pathways);
Python
from agenttool import pathways
doors = pathways()
print(doors["decision_tree"])
print(doors["pathways"])