---
title: "Build a plan: marks it building and returns its ticked steps as Build messages in order (send each one with a context item {kind: \"plan\", planId, stepIds}); each is a normal Build turn, metered as usual"
method: POST
path: "/builder/sessions/{sessionId}/plans/{planId}/build"
tags: ["Builder"]
---

# Build a plan: marks it building and returns its ticked steps as Build messages in order (send each one with a context item {kind: "plan", planId, stepIds}); each is a normal Build turn, metered as usual

`POST /builder/sessions/{sessionId}/plans/{planId}/build`

## Request

- Base URL: `https://hostingsurge.com/api/v1`
- URL: `https://hostingsurge.com/api/v1/builder/sessions/{sessionId}/plans/{planId}/build`
- Auth: one of:
  - HTTP bearer
  - API key in cookie `__Host-hs_session`

## Path parameters

- `sessionId` string, uuid, required
- `planId` string, uuid, required

## Response `200`

The messages to send

- object
  - `plan` object, required
    - `id` string, uuid, required
    - `sessionId` string, uuid, required
    - `turnId` string, uuid, required: The Plan turn that wrote it
    - `status` 'draft' | 'building' | 'done' | 'dismissed', required
    - `plan` object, required
      - `title` string, required
      - `goal` string, required
      - `summary` string, required
      - `pages` object[], required
        - `name` string, required
        - `path` string, nullable, required
        - `sections` string[], required
      - `steps` object[], required
        - `id` string, required
        - `title` string, required
        - `detail` string, required
        - `size` 'small' | 'medium' | 'large', required
        - `credits` number, required
        - `include` boolean, required
        - `done` boolean, required
        - `turnId` string, nullable, required
      - `questions` string[], required
    - `credits` number, required: Estimated Build Credits of the ticked steps not built yet
    - `createdAt` string, required: ISO-8601 timestamp
    - `updatedAt` string, required: ISO-8601 timestamp
  - `batches` object[], required
    - `prompt` string, required
    - `stepIds` string[], required
    - `credits` number, required

## Other responses

- `400`: Invalid request (code invalid_request; details.reason: unsupported, too_large, unreadable, no_text, reference_gone)
- `401`: Missing or invalid session/token (code unauthorized)
- `403`: Authenticated but not permitted (code forbidden; details.reason private_beta or role)
- `404`: Not found or not visible to the caller (code not_found)
- `409`: Refused for now (code conflict; details.reason: plan_building, plan_dismissed, plan_empty, refines_used, figma_connect, archived, stale)
- `429`: Too many requests (code rate_limited; details.reason mode_rate, daily_budget, provider_busy); see Retry-After
- `501`: Not available on this server (code not_configured; details.reason capture_off, figma_off, migration_pending)

---

[API](https://skmtc.dev/hostingsurge/apis/hostingsurge-platform-api.md) · [All operations](https://skmtc.dev/hostingsurge/apis/hostingsurge-platform-api/llms.txt) · [OpenAPI document](https://skmtc.dev/hostingsurge/apis/hostingsurge-platform-api/revisions/4d08337cdff1?raw)
