> For the complete documentation index, see [llms.txt](https://docs.trustlesswork.com/trustless-work/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.trustlesswork.com/trustless-work/v2-en/api-rest/deploy-1/manage-milestones.md).

# Manage Milestones

Builds the unsigned transaction where the escrow **admin** (`roles.admin`) adds new milestones and/or edits the description **and amount** of existing ones — all in a single atomic transaction.

{% hint style="info" %}
The reference below is generated from the **live API spec** — if anything on this page disagrees with it, the reference wins.
{% endhint %}

## Endpoint

## Add new milestones and/or edit existing milestone description / amount

> Single endpoint that ADDS new milestones (\`newMilestones\`) and EDITS description / amount of existing ones (\`milestoneUpdates\`) atomically. Description / amount edits are forbidden while the escrow holds funds.

```json
{"openapi":"3.0.0","info":{"title":"👋🏼 Trustless Work Core API — All Endpoints (Unified)","version":"1.0"},"security":[{}],"paths":{"/escrow/multi-release/v2/manage-milestones":{"post":{"description":"Single endpoint that ADDS new milestones (`newMilestones`) and EDITS description / amount of existing ones (`milestoneUpdates`) atomically. Description / amount edits are forbidden while the escrow holds funds.","operationId":"ManageMultiReleaseMilestonesV2Controller_manage","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ManageMultiReleaseMilestonesV2Dto"}}}},"responses":{"200":{"description":"Unsigned XDR built successfully.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnsignedTransactionResponse"}}}},"400":{"description":"Request body or query params fail schema validation (wrong type, missing required field, unknown property).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailsResponseDto"}}}},"401":{"description":"Missing, malformed, expired, revoked or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailsResponseDto"}}}},"403":{"description":"API key is valid but does not have the role required for this operation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailsResponseDto"}}}},"422":{"description":"Payload is well-formed but a business rule rejects it (e.g. amount out of range, role not allowed for this user).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailsResponseDto"}}}},"500":{"description":"Unexpected server-side failure. Use the `traceId` to look up the incident in server logs or contact support.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailsResponseDto"}}}}},"summary":"Add new milestones and/or edit existing milestone description / amount","tags":["Multi Release Escrow V2"]}}},"components":{"schemas":{"ManageMultiReleaseMilestonesV2Dto":{"type":"object","properties":{"contractId":{"type":"string","description":"Deployed multi-release v2 escrow contract (C...)."},"admin":{"type":"string","description":"Admin wallet — signs the transaction."},"newMilestones":{"description":"Brand-new milestones appended to the escrow (up to 50).","type":"array","items":{"$ref":"#/components/schemas/MultiReleaseMilestoneV2Dto"}},"milestoneUpdates":{"description":"Description / amount updates against existing milestones (up to 50). Forbidden while the escrow holds funds.","type":"array","items":{"$ref":"#/components/schemas/MultiReleaseMilestoneDescriptionUpdateV2Dto"}}},"required":["contractId","admin","newMilestones","milestoneUpdates"]},"MultiReleaseMilestoneV2Dto":{"type":"object","properties":{"description":{"type":"string","description":"Human-readable milestone description."},"amount":{"type":"number","description":"Amount allocated to THIS milestone, in human-readable decimals. Each milestone holds and releases its own portion independently."},"receiver":{"type":"string","description":"Final beneficiary of THIS milestone’s payout. Each milestone may pay a different address (multi-release v2 holds `receiver` per milestone — `roles.receiver` does not exist on multi-release v2)."},"status":{"type":"string","description":"Initial status. Convention: pending → in_progress → completed. Defaults to \"pending\"."},"approvalsTarget":{"type":"number","description":"Number of distinct approvers required for the milestone. Must be > 0 and ≤ roles.approvers.length. Defaults to 1."}},"required":["description","amount","receiver"]},"MultiReleaseMilestoneDescriptionUpdateV2Dto":{"type":"object","properties":{"index":{"type":"number","description":"Zero-based index of the milestone to update."},"newDescription":{"type":"string","description":"New milestone description. When absent, the previous description is preserved.","maxLength":500},"newAmount":{"type":"number","description":"New milestone amount in human-readable decimals. When absent, the previous amount is preserved. Forbidden while the escrow holds funds."}},"required":["index"]},"UnsignedTransactionResponse":{"type":"object","properties":{"unsignedXdr":{"type":"string","description":"Base64-encoded unsigned XDR. Sign it with the appropriate wallet and submit to Soroban / Horizon to execute the operation on-chain."},"txHash":{"type":"string","description":"SHA-256 hash of the prepared transaction. NOTE: it only matches the executed transaction if you sign the XDR exactly as returned — re-preparing (re-simulating) it changes the hash. Prefer `contractId` for correlation when present."},"contractId":{"type":"object","description":"Deploys only: the address (C…) the new escrow contract WILL have once this transaction executes — known upfront because the service generates the deploy salt. Track your escrow with it (e.g. `GET /escrows/:contractId`) as soon as the transaction lands; it is stable even if your wallet/SDK re-prepares the transaction.","nullable":true}},"required":["unsignedXdr","txHash"]},"ProblemDetailsResponseDto":{"type":"object","properties":{"type":{"type":"string","description":"Stable URI identifying the error type. Hash-link points to the docs."},"title":{"type":"string","description":"Short human-readable summary of the problem."},"status":{"type":"number","description":"HTTP status code, repeated here for typed clients."},"code":{"type":"string","description":"Machine-readable error code. Stable across versions; safe to switch on."},"detail":{"type":"string","description":"Human-readable explanation specific to this occurrence."},"instance":{"type":"string","description":"URI of the request that triggered the error."},"traceId":{"type":"string","description":"Correlation id propagated from the `X-Trace-Id` header (or generated). Use it when contacting support to reference a specific request."},"extensions":{"type":"object","description":"Optional structured context. Shape depends on the error code; documented per-endpoint when relevant.","additionalProperties":true}},"required":["type","title","status","code","detail"]}}}}
```

## Field notes

* In multi-release every milestone carries its own `amount` (> 0) — editing amounts changes what each milestone will release.
* New milestones follow the deploy shape; `approvalsTarget` ≤ the number of `roles.approvers`.
* Approval state already collected is not reset by edits.

## What this endpoint returns

`unsignedXdr` + `txHash` — sign the XDR **exactly as returned** and submit it via [Send Transaction](/trustless-work/v2-en/api-rest/stellar/send-transaction.md).

## Next steps

* Report progress on the new milestones: [Change Milestone Status](/trustless-work/v2-en/api-rest/deploy-1/change-milestone-status.md)


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.trustlesswork.com/trustless-work/v2-en/api-rest/deploy-1/manage-milestones.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
