Skip to content

Create bid

POST
/bids
curl --request POST \
--url https://app.buildworkpro.com/api/v1/bids \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{ "bidNumber": "example", "name": "example", "leadId": 1, "contactId": 1, "projectId": 1, "dueDate": "example", "validUntil": "example", "rejectedAt": "example", "cancelReason": "example", "cancelledAt": "example", "cancelledFromStatus": "example", "taxRate": "example", "discountType": "example", "discount": "example", "siteAddress": "example", "siteCity": "example", "siteState": "example", "siteZipCode": "example", "latitude": "example", "longitude": "example", "notes": "example", "terms": "example", "paymentTermsText": "example", "paymentTermId": 1, "marginPercent": "example", "companyOhPercent": "example", "commissionPercent": "example", "showSublines": true, "roundSalesAmounts": true, "kanbanOrder": 1 }'

Creates a new bid in draft status.

Idempotency-Key
string format: uuid
<= 255 characters

Idempotent retry key for mutating operations. The first request with a given key executes normally and BuildWorkPro caches the response. Replaying the same key with the same request body (method + path + JSON body, SHA-256 hashed) returns the cached response without re-executing the mutation. Replaying with a DIFFERENT body returns 409 idempotency_key_reused. The cache TTL is 24 hours; after expiry the key is treated as a new operation. Keys are tenant-scoped. Recommended: a fresh UUID v4 per logical operation.

Media type application/json
object
bidNumber
string
name
string | null
<= 255 characters
leadId
integer | null
>= -2147483648 <= 2147483647
contactId
integer | null
>= -2147483648 <= 2147483647
projectId
integer | null
>= -2147483648 <= 2147483647
dueDate
string | null
validUntil
string | null
rejectedAt
string | null
cancelReason
string | null
cancelledAt
string | null
cancelledFromStatus
string | null
<= 50 characters
taxRate
string | null
discountType
string | null
<= 20 characters
discount
string | null
siteAddress
string | null
siteCity
string | null
<= 255 characters
siteState
string | null
<= 100 characters
siteZipCode
string | null
<= 20 characters
latitude
string | null
longitude
string | null
notes
string | null
terms
string | null
paymentTermsText
string | null
paymentTermId
integer | null
>= -2147483648 <= 2147483647
marginPercent
string | null
companyOhPercent
string | null
commissionPercent
string | null
showSublines
boolean | null
roundSalesAmounts
boolean | null
kanbanOrder
integer
>= -2147483648 <= 2147483647
Example generated
{
"bidNumber": "example",
"name": "example",
"leadId": 1,
"contactId": 1,
"projectId": 1,
"dueDate": "example",
"validUntil": "example",
"rejectedAt": "example",
"cancelReason": "example",
"cancelledAt": "example",
"cancelledFromStatus": "example",
"taxRate": "example",
"discountType": "example",
"discount": "example",
"siteAddress": "example",
"siteCity": "example",
"siteState": "example",
"siteZipCode": "example",
"latitude": "example",
"longitude": "example",
"notes": "example",
"terms": "example",
"paymentTermsText": "example",
"paymentTermId": 1,
"marginPercent": "example",
"companyOhPercent": "example",
"commissionPercent": "example",
"showSublines": true,
"roundSalesAmounts": true,
"kanbanOrder": 1
}

Created

Media type application/json
object
data
required
object
id
required
integer
bidNumber
required
string
contactId
required
integer | null
leadId
required
integer | null
projectId
required
integer | null
status
required
string
subtotal
required
string | null
taxAmount
required
string | null
total
required
string | null
discountAmount
string | null
taxRate
required
string | null
discount
required
string | null
discountType
required
string | null
validUntil
required
Any of:
string format: date-time
notes
required
string | null
terms
required
string | null
siteAddress
required
string | null
siteCity
string | null
siteState
string | null
siteZipCode
string | null
sentAt
required
Any of:
string format: date-time
acceptedAt
required
Any of:
string format: date-time
acceptedBy
required
string | null
createdAt
required
Any of:
string format: date-time
updatedAt
required
Any of:
string format: date-time
meta
required
object
request_id

Server-generated request identifier

string
pagination
object
cursor
required

Opaque cursor for the next page; null when no more results

string | null
has_more
required

Whether more pages are available after this one

boolean
count
required

Items in this page

integer
Example generated
{
"data": {
"id": 1,
"bidNumber": "example",
"contactId": 1,
"leadId": 1,
"projectId": 1,
"status": "example",
"subtotal": "example",
"taxAmount": "example",
"total": "example",
"discountAmount": "example",
"taxRate": "example",
"discount": "example",
"discountType": "example",
"validUntil": "2026-04-15T12:00:00Z",
"notes": "example",
"terms": "example",
"siteAddress": "example",
"siteCity": "example",
"siteState": "example",
"siteZipCode": "example",
"sentAt": "2026-04-15T12:00:00Z",
"acceptedAt": "2026-04-15T12:00:00Z",
"acceptedBy": "example",
"createdAt": "2026-04-15T12:00:00Z",
"updatedAt": "2026-04-15T12:00:00Z"
},
"meta": {
"request_id": "example",
"pagination": {
"cursor": "example",
"has_more": true,
"count": 1
}
}
}

Error

Media type application/problem+json
object
type
required

URL identifying the problem type

string format: uri
title
required

Short human-readable summary

string
status
required

HTTP status code

integer
detail

Human-readable explanation

string
request_id

Server-generated request identifier

string
errors

Validation error array (422 only)

Array<object>
object
field
required

Field path that failed validation

string
code
required

Validation error code

string
message
required

Human-readable validation message

string
Example generated
{
"type": "https://example.com",
"title": "example",
"status": 1,
"detail": "example",
"request_id": "example",
"errors": [
{
"field": "example",
"code": "example",
"message": "example"
}
]
}