---
title: "Create sandbox Renovation milestone"
method: POST
path: "/renovations/current/projects/{projectId}/milestones"
tags: ["Renovations"]
---

# Create sandbox Renovation milestone

`POST /renovations/current/projects/{projectId}/milestones`

## Request

- Base URL: `https://platform-api.homejourney.sg/v1`
- URL: `https://platform-api.homejourney.sg/v1/renovations/current/projects/{projectId}/milestones`
- Auth: HTTP bearer

Creates a service-role-only sandbox Renovation project milestone when the authenticated automation client has `renovations.projects.write`, the Renovation project route gate is enabled, and an `Idempotency-Key` is provided. External URL: `/v1/renovations/current/projects/{projectId}/milestones`. Current Next.js implementation path: `/api/platform/v1/renovations/current/projects/[projectId]/milestones`. The response exposes redacted milestone status only: cost impact, supplier pricing, payment state, raw documents, client PII, and live action controls remain unavailable.

## Path parameters

- `projectId` string, required

## Headers

- `X-Correlation-Id` string
- `Idempotency-Key` string, required

## Request body

- CreatePlatformRenovationMilestoneRequest
  - `milestone_key` string, required: Partner-owned milestone key scoped to the Renovation project.
  - `milestone_name` string, required
  - `due_date` string, date, nullable
  - `metadata` object: Optional public-safe milestone metadata. Cost impact and supplier pricing remain redacted.

## Response `200`

Sandbox Renovation project response.

- PlatformRenovationMilestoneMutationResponse
  - `milestone` PlatformRenovationMilestoneSummary, required
    - `id` string, uuid, required
    - `project_id` string, uuid, required
    - `milestone_key` string, required
    - `milestone_name` string, required
    - `milestone_status` 'not_started' | 'in_progress' | 'blocked' | 'completed' | 'cancelled', required
    - `progress_percent` integer, required
    - `due_date` string, date, nullable, required
    - `completed_at` string, date-time, nullable, required
    - `blocked_reason` string, nullable, required
    - `client_visible` boolean, required
    - `role_visibility` string, required
    - `redaction` object, required
      - `cost_impact_redacted` true, required
      - `supplier_price_redacted` true, required
    - `version` integer, required
    - `updated_at` string, date-time, required
  - `safety` PlatformRenovationWorkspaceSafety, required
    - `service_role_only_tables` true, required
    - `partner_reads_exposed` false, required
    - `live_actions_exposed` false, required
    - `cost_fields_redacted` true, required
    - `supplier_pricing_redacted` true, required
    - `payment_state_redacted` true, required
  - `livemode` false, required
  - `request_id` string, required
  - `idempotency_key_hash` string, required

## Other responses

- `400`: Request validation failed.
- `401`: Missing or invalid platform API key.
- `403`: Credential, environment, or scope is not allowed.
- `404`: Platform API feature or resource is not available.
- `409`: Idempotency key is in progress or conflicts with an earlier request body.
- `429`: Rate limit exceeded.
- `500`: Unexpected platform API failure.

---

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