# Guide

URL: https://docs.hanzo.ai/docs/openapi/guide

> The AI that builds an agentic company with you, one measured step at a time.

Also for this capability: **API** · [CLI](https://docs.hanzo.ai/docs/cli/guide) · [MCP](https://docs.hanzo.ai/docs/mcp-tools/guide) · [SDKs](https://docs.hanzo.ai/docs/sdks)

The AI that builds an agentic company with you, one measured step at a time.

> [All API references →](https://docs.hanzo.ai/docs/openapi) · [Get started →](https://docs.hanzo.ai/docs/guides)

|                |                                        |
| -------------- | -------------------------------------- |
| **Base URL**   | `https://api.hanzo.ai`                 |
| **Operations** | 15                                     |
| **Auth**       | `Authorization: Bearer $HANZO_API_KEY` |

## Specification

> **HIP-1130 · Guide — The Launch Journey** — Draft · [read the specification →](https://github.com/hanzoai/hips/blob/7ed737180339cd05b5f2935eafe7f7b83d2449a2/HIPs/hip-1130-guide-launch-journey.md)

`/v1/guide` is the Business AI Guide: an interactive launch checklist every org
completes on-site — a checklist engine over a machine-readable curriculum, a
Business AI agent that can execute a step through the caller's own tool plane,
and a versioned brand blueprint the whole journey is projected from. It is
implemented in `hanzoai/cloud` at `apps/guide` (HIP-0106).

### Motivation

Onboarding advice that lives in prose goes stale and cannot be acted on. A
journey that is data — steps with dependencies, done-criteria mapped to real
signals, tools bound to steps — can be auto-marked when the org has demonstrably
done the work, and executed by an agent when the org asks. The three concerns
are kept orthogonal on purpose: the engine is pure functions over plain data,
the agent acts only through the caller's own authority, and the blueprint is
content a SuperAdmin authors live (`apps/guide/curriculum.go:6-31`).

### Specification

The key words MUST, MUST NOT, SHOULD, SHOULD NOT and MAY are to be interpreted
as in RFC 2119.

#### §1 Two stores, two tiers

Per-org progress and the org's own curriculum override live in that org's own
database, opened through `cloud.OrgStore` — one file per org, resolved through
the one namespace door (`apps/guide/guide.go:47-63`). The shared brand blueprint
is a second, deployment-wide store (`apps/guide/blueprint_store.go:45`), seeded
idempotently from embedded fixtures — the base journey plus one YAML file per
brand (`apps/guide/brands.go`) — after which the database is authoritative and
the fixture is only the fail-safe fallback. A redeploy MUST NOT clobber a live
edit; seeding is if-absent (`apps/guide/guide.go:78-88`).

#### §2 The address

Nineteen operations under `/v1/guide`. All are typed except six, each declared
with prose beside its route (`apps/guide/guide.go:262-360`) because its body has
no declarable shape: the curriculum and blueprint writes accept YAML **or** JSON
as a raw body (the canonical parsed form is what is stored); the blueprint PATCH
is a shallow merge whose keys are the patched item's, not the route's; and
`steps/{id}/do` answers either JSON or a Server-Sent-Event stream of the agent's
actions. Every declared description renders only while the router serves the
route, so the prose can never invent a path.

A step transition is dependency-gated: a blocked start or done is 409 carrying
`blockedBy` naming the exact steps in the way. A write that does not parse or
does not validate (unique ids, acyclic dependencies) is 422 and the journey in
force is untouched.

#### §3 Tenancy, and the gate that differs by tier

The tenant is `principal.Org` — the org minted from the validated bearer
(HIP-0026), never a header (`apps/guide/guide.go:382-385`). The per-org
curriculum override is any validated member's surface. The brand blueprint is
platform content: authoring it requires SuperAdmin (`apps/guide/admin.go:39`),
a per-org admin is 403, and every write is audited and versioned with the prior
versions kept as a recovery trail.

#### §4 Money

Guide is free (`cloud.Free`, `plugin/guide/main.go`). The one executing path —
"do it for me" — runs the step's tool through the calling principal's own MCP
plane (`automations.InvokeTool`), so the work is metered and audited by the
plane that owns it, against the caller's ledger (`apps/guide/agent.go:61`).
Guide itself debits nothing and MUST NOT acquire an authority the caller does
not hold.

#### §5 Events and observability

It publishes nothing on the bus. It emits nothing beyond the request span every
route gets; the audit trail for blueprint authoring is the shared audit plane,
not a telemetry stream.

#### §6 Stage

`beta`: a vertical application — a guided launch product over the core planes,
not one of them.

#### §7 Upstream

It derives from none. The curriculum fixtures are embedded YAML authored here;
the growth signals are injected read seams bound at the composition root, so
guide imports none of the subsystems it observes (`apps/guide/signals.go`).

### Rationale

The alternative to a data blueprint is a hard-coded journey, which makes every
white-label brand and every content edit a code change. The alternative to
executing through the caller's own tool plane is a service identity that acts
for orgs — which is an escalation surface, and the reason the agent runs AS the
caller instead.

### Security Considerations

The two tiers are the exposure. If the per-org gate could reach the shared
blueprint, one tenant would edit every org's journey — including which MCP tools
the Business AI runs for a step, which is a lever over agents in every org; the
SuperAdmin gate and the audit trail on that tier exist for exactly this. On the
executing path, the wrong implementation runs tools under an authority wider
than the caller's; here the invocation is per-principal, so a step can never do
what its asker could not.

## Four surfaces

| Surface  | Reaches this capability as                    | Coverage                                                                   |
| -------- | --------------------------------------------- | -------------------------------------------------------------------------- |
| **REST** | `guide` at its own prefix                     | 15 operations                                                              |
| **CLI**  | `hanzo guide …`                               | 15 of 15                                                                   |
| **SDK**  | `GuideApi` in every published client          | 15 methods                                                                 |
| **MCP**  | tool `guide` on `https://api.hanzo.ai/v1/mcp` | 13 operations, 4 under the document's own id — ask `describe` for the rest |

## Quickstart

```bash
export HANZO_API_KEY=sk-...   # console.hanzo.ai → API keys
```

Then the first call — a read that needs nothing but the key. `GET /v1/guide`, operation `get_guide`:

**CLI**

```bash
hanzo guide get
```

**SDK**

**.ts**

```ts
import { Configuration, GuideApi } from 'hanzoai';

const api = new GuideApi(new Configuration({ accessToken: process.env.HANZO_API_KEY }));
const { data } = await api.getGuide();
```

**.py**

```python
from hanzoai.cloud import ApiClient, Configuration
from hanzoai.cloud.api import GuideApi

client = ApiClient(Configuration(access_token=os.environ["HANZO_API_KEY"]))
result = GuideApi(client).get_guide()
```

**.go**

```go
cfg := hanzoai.NewConfiguration()
cfg.AddDefaultHeader("Authorization", "Bearer "+os.Getenv("HANZO_API_KEY"))
client := hanzoai.NewAPIClient(cfg)

resp, _, err := client.GuideAPI.GetGuide(context.Background()).Execute()
if err != nil {
	return err
}
```

**.rs**

```rust
use hanzo_client::apis::{configuration::Configuration, guide_api};

let mut cfg = Configuration::new();
cfg.bearer_access_token = std::env::var("HANZO_API_KEY").ok();

let result = guide_api::get_guide(&cfg, Default::default()).await?;
```

**.java**

```java
import ai.hanzo.cloud.ApiClient;
import ai.hanzo.cloud.api.GuideApi;

ApiClient client = new ApiClient();
client.setBearerToken(System.getenv("HANZO_API_KEY"));

var result = new GuideApi(client).getGuide();
```

**HTTP**

```bash
curl https://api.hanzo.ai/v1/guide \
  -H "Authorization: Bearer $HANZO_API_KEY"
```

**MCP**

MCP reaches **guide** through the `guide` tool, which names its 13 operations with its own verbs — this one among them, under a name only MCP declares. `describe` explains any of them:

```bash
curl -X POST https://api.hanzo.ai/v1/mcp \
  -H "Content-Type: application/json" \
  -d '{
       "jsonrpc": "2.0",
       "id": 1,
       "method": "tools/call",
       "params": {
         "name": "describe",
         "arguments": {
           "op": "list_guides"
         }
       }
     }'
```

Answers `200` with `object` — ok.

## Endpoints

| Endpoint                                                                                                   | What it does                                                                                                                                                                                                                                                                                                  |
| ---------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| [`GET /v1/guide/actions`](https://docs.hanzo.ai/docs/openapi/guide/get-guide-actions)                      | Returns the caller org's Business AI action ledger, most recent first: every "do it for me" tool call, the arguments it ran with, its result and whether it succeeded.                                                                                                                                        |
| [`GET /v1/guide/analytics`](https://docs.hanzo.ai/docs/openapi/guide/get-guide-analytics)                  | Returns the caller org's funnel from the analytics lens plus the GTM recommendations derived from it.                                                                                                                                                                                                         |
| [`POST /v1/guide/chat`](https://docs.hanzo.ai/docs/openapi/guide/post-guide-chat)                          | Answers a founder's question about their launch journey as the Business AI coach: it grounds the reply in the org's REAL progress, its ranked available quests and its analytics funnel, and returns those candidate quests alongside so the caller can act on one.                                           |
| [`GET /v1/guide/curriculum`](https://docs.hanzo.ai/docs/openapi/guide/get-guide-curriculum)                | Returns the journey the caller's org is actually running, and whether it comes from the org's OWN override (custom) or from the platform default — the brand blueprint, else the embedded fixture.                                                                                                            |
| [`PUT /v1/guide/curriculum`](https://docs.hanzo.ai/docs/openapi/guide/put-guide-curriculum)                | Replace your org's journey with a curriculum you author                                                                                                                                                                                                                                                       |
| [`DELETE /v1/guide/curriculum`](https://docs.hanzo.ai/docs/openapi/guide/delete-guide-curriculum)          | Clears the caller org's curriculum override and returns the journey it falls back to — the brand blueprint, else the embedded fixture.                                                                                                                                                                        |
| [`GET /v1/guide/profile`](https://docs.hanzo.ai/docs/openapi/guide/get-guide-profile)                      | Returns the caller org's OBSERVED growth profile — the signal set, the classified growth stage, and the org's own key metrics.                                                                                                                                                                                |
| [`POST /v1/guide/steps/{id}/do`](https://docs.hanzo.ai/docs/openapi/guide/post-guide-steps-by-id-do)       | Have the Business AI actually do the step for you                                                                                                                                                                                                                                                             |
| [`POST /v1/guide/steps/{id}/done`](https://docs.hanzo.ai/docs/openapi/guide/post-guide-steps-by-id-done)   | Marks one step of the caller org's journey complete and returns the refreshed journey.                                                                                                                                                                                                                        |
| [`POST /v1/guide/steps/{id}/reset`](https://docs.hanzo.ai/docs/openapi/guide/post-guide-steps-by-id-reset) | Returns one step of the caller org's journey to todo — clearing a manual mark or a skip — and returns the refreshed journey.                                                                                                                                                                                  |
| [`POST /v1/guide/steps/{id}/skip`](https://docs.hanzo.ai/docs/openapi/guide/post-guide-steps-by-id-skip)   | Marks one step of the caller org's journey skipped and returns the refreshed journey.                                                                                                                                                                                                                         |
| [`POST /v1/guide/steps/{id}/start`](https://docs.hanzo.ai/docs/openapi/guide/post-guide-steps-by-id-start) | Marks one step of the caller org's journey in progress and returns the refreshed journey.                                                                                                                                                                                                                     |
| [`GET /v1/guide/strategies`](https://docs.hanzo.ai/docs/openapi/guide/get-guide-strategies)                | Returns the ENABLED tactics corpus for the caller's org: the tactics library narrowed by the explicit category/workload filters AND by the org's OBSERVED growth stage and capability signals (a tactic's tags are preconditions, so it surfaces only once the org can act on it).                            |
| [`GET /v1/guide/suggest`](https://docs.hanzo.ai/docs/openapi/guide/get-guide-suggest)                      | Returns the caller org's next-best quests: the available, non-terminal steps of its journey ranked by how much downstream work each unblocks, each with the grounded reason it is a good next move and whether the Business AI can run it, plus the org's funnel and the GTM recommendations derived from it. |
| [`GET /v1/guide`](https://docs.hanzo.ai/docs/openapi/guide/get-guide)                                      | Returns the caller org's launch journey: the active curriculum's version and title, every step with its state, whether it is available, what blocks it and whether the Business AI can run it, the done/total/percent progress with the next step to take, and the org's analytics funnel folded in.          |

---

[All Hanzo APIs](https://docs.hanzo.ai/docs/openapi) · [Interactive reference](https://docs.hanzo.ai/docs/openapi/reference)
