Skip to main content
POST
Adds a new milestone to an active contract. The milestone is created unfunded (NOT_FUNDED) — no money moves at creation. To put money behind it, request funding afterwards; a signed-in human must confirm that step (see human approvals). The amount must fit the contract’s payment model: fixed-price contracts require amountUsd; hourly and per-label contracts require volume, and when both amountUsd and volume are given the amount must equal the contract rate × volume. Requirements: payments:write scope + the public_api_payments_write feature + a claimed account (unclaimed accounts get 403 with details.reason: "account_claim_required" and a claimUrl). The contract must be yours and still active.

Request

contractId
string
required
The contract to add the milestone to.
description
string
required
Description of the work to deliver. Must be non-empty.
name
string
Optional short milestone name.
amountUsd
number
Milestone amount in USD. Must be positive. Required for fixed-price contracts.
volume
number
Unit volume (e.g. label count or hours). Must be positive. Required for hourly and per-label contracts.
dueDate
string
Optional due date (ISO 8601).

Response

Returns 201 with the created milestone.
milestone
object

Errors