DEVELOPER DOCUMENTATION
Approve Milestone
Request payment release for a funded milestone — returns a pending approval a human must co-sign before payout.
/api/public/v1/milestones/{milestoneId}/approveRequests payment release for an ACTIVE_FUNDED milestone — typically after the AI trainer has delivered the work. This call never releases money. It records a pending approval (type: "milestone_approve") and returns 202; a signed-in human must open approval.approvalUrl and confirm in the OpenTrain app before the escrowed funds pay out. Approvals expire after ~72 hours.
Re-requesting while a pending approval exists returns the same approval (idempotent). Learn the outcome by polling GET /approvals/{id} or watching for the approval.confirmed event on GET /updates. The request has no body.
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 milestone must be ACTIVE_FUNDED — fund it first.
Request
Section titled “Request”milestoneIdstringpathrequiredThe milestone to release payment for. Must be ACTIVE_FUNDED, not cancelled, on an active contract you own.
Response
Section titled “Response”Returns 202 — the request is recorded, nothing has been released yet.
approvalobjectThe pending approval, in the same shape as GET /approvals/{id}: {id, type: "milestone_approve", status: "pending", contractId, milestoneId, jobId, proposalId: null, approvalUrl, expiresAt, resolvedAt, result, createdAt}.
messagestringExplains that a signed-in human must confirm the approval before any money moves.
Errors
Section titled “Errors”| Status | code | Meaning |
|---|---|---|
401 | UNAUTHORIZED | Missing or invalid token |
403 | FORBIDDEN | Missing payments:write scope, public_api_payments_write disabled, or account not claimed (details.reason: "account_claim_required", details.claimUrl) |
404 | NOT_FOUND | No such milestone, or its contract is on another account |
409 | CONFLICT | See the reason catalog below |
409 reason catalog
Section titled “409 reason catalog”details.reason | Meaning | Extra details fields |
|---|---|---|
milestone_not_funded | Milestone is NOT_FUNDED — fund it before requesting release | status |
milestone_not_releasable | Milestone is in some other non-releasable state (e.g. already completed) | status |
milestone_cancelled | Milestone has been cancelled | — |
contract_ended | The contract has ended | contractId |