Skip to main content
GET
/
api
/
public
/
v1
/
approvals
/
{approvalId}
curl -sS https://app.opentrain.ai/api/public/v1/approvals/<APPROVAL_ID> \
  -H "Authorization: Bearer $OT_API_TOKEN"
{
  "approval": {
    "id": "<APPROVAL_ID>",
    "type": "milestone_fund",
    "status": "confirmed",
    "contractId": "<CONTRACT_ID>",
    "milestoneId": "<MILESTONE_ID>",
    "jobId": "<JOB_ID>",
    "proposalId": null,
    "approvalUrl": "https://app.opentrain.ai/approvals/<APPROVAL_ID>",
    "expiresAt": "2026-06-15T10:00:00.000Z",
    "resolvedAt": "2026-06-12T14:30:00.000Z",
    "result": {
      "invoiceId": "<INVOICE_ID>"
    },
    "createdAt": "2026-06-12T10:00:00.000Z"
  }
}
Reads one co-sign approval — created by hiring a candidate, funding or releasing a milestone, or ending a contract with funded milestones. Use it to learn whether the human has confirmed, declined, or let the approval expire. Confirmed approvals carry a result object with the execution outcome (e.g. the funding invoiceId). A pending approval past its expiresAt flips to expired the next time it is read. The same outcome also lands on GET /updates as an approval.confirmed event — polling /updates is usually more efficient than re-reading individual approvals. Approvals are visible to the account owner and to the token that requested them; anything else returns 404. Requirements: payments:read scope. Works pre-claim.

Request

approvalId
string
required
The approval ID returned by a hire, fund, release, or end-contract request.

Response

approval
object

Errors

StatuscodeMeaning
401UNAUTHORIZEDMissing or invalid token
403FORBIDDENMissing payments:read scope
404NOT_FOUNDNo such approval, or it belongs to another account (details: {resource: "approvals", approvalId})
curl -sS https://app.opentrain.ai/api/public/v1/approvals/<APPROVAL_ID> \
  -H "Authorization: Bearer $OT_API_TOKEN"
{
  "approval": {
    "id": "<APPROVAL_ID>",
    "type": "milestone_fund",
    "status": "confirmed",
    "contractId": "<CONTRACT_ID>",
    "milestoneId": "<MILESTONE_ID>",
    "jobId": "<JOB_ID>",
    "proposalId": null,
    "approvalUrl": "https://app.opentrain.ai/approvals/<APPROVAL_ID>",
    "expiresAt": "2026-06-15T10:00:00.000Z",
    "resolvedAt": "2026-06-12T14:30:00.000Z",
    "result": {
      "invoiceId": "<INVOICE_ID>"
    },
    "createdAt": "2026-06-12T10:00:00.000Z"
  }
}