Mark a step of your org's journey finished
Moves one step of the caller org's journey to done and answers the whole refreshed journey, which is what unblocks everything downstream of it.
POST /v1/guide/steps/{id}/done
| Address | https://api.hanzo.ai/v1/guide/steps/{id}/done |
| Method | POST |
| Operation | post_guide_steps_by_id_done |
| Auth | Authorization: Bearer $HANZO_API_KEY |
Moves one step of the caller org's journey to done and answers the whole refreshed journey, which is what unblocks everything downstream of it.
Dependency-GATED like start: finishing a step whose prerequisites are themselves unfinished is 409 carrying {error, step, blockedBy} naming what is in the way, not a silent success. A step id the org's active journey does not contain is 404. Skipping is the ungated alternative — a founder declaring a step does not apply — and it lives at /skip.
Requires a validated org; 403 without one. The mark is recorded as manual, and /reset returns the step to todo.
Request
1 field.
| Field | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | yes |
Response
The document declares no response body for this operation. It answers 200 on success and the platform error shape on failure — see Errors.
Examples
hanzo guide steps done <id>import { Configuration, GuideApi } from 'hanzoai';
const api = new GuideApi(new Configuration({ accessToken: process.env.HANZO_API_KEY }));
const { data } = await api.postGuideStepsByIdDone({ id: 'id' });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).post_guide_steps_by_id_done(id='id')cfg := cloud.NewConfiguration()
cfg.AddDefaultHeader("Authorization", "Bearer "+os.Getenv("HANZO_API_KEY"))
client := cloud.NewAPIClient(cfg)
resp, _, err := client.GuideAPI.PostGuideStepsByIdDone(context.Background()).Execute()
if err != nil {
return err
}use hanzo_cloud::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::post_guide_steps_by_id_done(&cfg, Default::default()).await?;import ai.hanzo.cloud.ApiClient;
import ai.hanzo.cloud.api.GuideApi;
ApiClient client = new ApiClient();
client.setRequestInterceptor(b -> b.header("Authorization", "Bearer " + System.getenv("HANZO_API_KEY")));
var result = new GuideApi(client).postGuideStepsByIdDone();curl -X POST https://api.hanzo.ai/v1/guide/steps/<id>/done \
-H "Authorization: Bearer $HANZO_API_KEY"The door reaches guide through the guide tool, which names its 19 operations with its own verbs — this one among them, under a name only the door declares. describe explains any of them:
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": "get_guide"
}
}
}'How is this guide?