Skip to main content
POST
Create (submit) a proposal

Authorizations

X-API-KEY
string
header
required
OW-KEY
string
header
required

OpenWrench shared secret. Required on every request alongside X-API-KEY; issued together with your API key.

Body

application/json

Proposal create payload (verified against the shared proposal constructor). status is always forced to "pending" and supplierFacilityId to the API key's facility; caller values for them are ignored. Monetary values are strings and are validated as parseable numbers - laborLineItems require numeric hourlyRate and amount, materialLineItems numeric quantity, amount and unitPrice. Unknown fields are ignored.

workOrderId
integer<int64>
required

REQUIRED. Work order the proposal is for; must exist. locationId, buyerFacilityId and buyerCompanyId are derived from it.

totalAfterTax
string
required

REQUIRED. Must parse as a number.

id
integer<int64>

Existing proposal id (update semantics)

scope
string
attachments
object[]
taxRate
string

Defaults to "0"; must parse as a number

tax
string

Defaults to "0"; must parse as a number

totalBeforeTax
string

Defaults to "0"; must parse as a number

laborTaxRate
string

Must parse as a number if present

laborTax
string

Must parse as a number if present

laborTotalBeforeTax
string

Defaults to "0"; must parse as a number

laborLineItems
object[]
materialTaxRate
string
materialTax
string
materialTotalBeforeTax
string

Defaults to "0"; must parse as a number

materialLineItems
object[]
travelTaxRate
string
travelTax
string
travelTotalBeforeTax
string

Defaults to "0"; must parse as a number

travelLineItems
object[]
freightTaxRate
string
freightTax
string
freightTotalBeforeTax
string

Defaults to "0"; must parse as a number

freightLineItems
object[]
miscTaxRate
string
miscTax
string
miscTotalBeforeTax
string
miscLineItems
object[]

Each amount must parse as a number

incurredCostTotalBeforeTax
string
incurredCostLineItems
object[]

Each amount must parse as a number

Must be a valid URL

declineNotes
object[]
requestForProposalId
integer<int64>

Defaults to the work order's RFP when omitted

isAiParsed
boolean

Client-asserted AI-parse provenance; default false

isAiParsedEdited
boolean

Default false

aiParseMismatchSignedByEmail
string

Response

Successful response

type
string
required

Entity type label, e.g. "Proposal". Endpoints that derive it via Scala reflection (most generic list/get endpoints) may return the fully qualified server class name instead (e.g. "models.workorder.WorkOrder"); treat this field as informational.

data
object
required

Proposal / quote (abridged - approval-hierarchy, capex/rm category and hydrated relation fields omitted).

status
enum<string>
required

"ok" on success

Available options:
ok