DevelopersAPI reference

Quotes API

REST endpoints for quotes in SKUFlow: 16 operations with parameters, request and response fields, permissions and curl examples.

Base URL: https://app.skuflow.ai/api. Every call needs Authorization: Bearer skf_… (Authentication); {organizationId} ($ORGANIZATION_ID in the examples) is your business's id.

OperationEndpointRisk
List quotesGET /organizations/{organizationId}/quotesread
Create a draft quotePOST /organizations/{organizationId}/quoteswrite
Get a quote with options, lines and totalsGET /organizations/{organizationId}/quotes/{quoteId}read
Update a quotePATCH /organizations/{organizationId}/quotes/{quoteId}write
Delete a quoteDELETE /organizations/{organizationId}/quotes/{quoteId}sensitive
Update a quote's taxPOST /organizations/{organizationId}/quotes/{quoteId}/taxwrite
Mark a quote as sentPOST /organizations/{organizationId}/quotes/{quoteId}/sendsensitive
Approve on the customer's behalfPOST /organizations/{organizationId}/quotes/{quoteId}/approvesensitive
Archive a quotePOST /organizations/{organizationId}/quotes/{quoteId}/archivewrite
Duplicate a quote as a new draftPOST /organizations/{organizationId}/quotes/{quoteId}/duplicatewrite
Replace the customer linkPOST /organizations/{organizationId}/quotes/{quoteId}/linksensitive
Convert an approved quote to an invoicePOST /organizations/{organizationId}/quotes/{quoteId}/invoicewrite
Price a product line before adding it to a quoteGET /organizations/{organizationId}/quotes/price-lineread
List a quote's proofsGET /organizations/{organizationId}/quotes/{quoteId}/proofsread
Send a new proof of a designPOST /organizations/{organizationId}/quotes/{quoteId}/proofssensitive
Reply on a proofPOST /organizations/{organizationId}/quotes/{quoteId}/proofs/{proofId}/commentssensitive

List quotes

GET /organizations/{organizationId}/quotes

Quotes (Q-n) newest first, filtered by text, status, customer or request; paged with a total. totalCents is the approved total, else the lowest option's total. Sent quotes past validUntil read as EXPIRED. Read-only.

Permissionquotes.read (Owner, Admin, Staff, Member)
Riskread, OAuth scope skuflow.read. Read: reads only.
MCP toolquotes_list (toolset sales, in the default set)

Parameters

NameInTypeRequiredDescription
queryquerystringNoFree-text search over the list's names, numbers and contact details. Up to 200 characters.
statusqueryenumNoOne of DRAFT, SENT, APPROVED, CHANGES_REQUESTED, DECLINED, CONVERTED, EXPIRED, ARCHIVED.
customerIdquerystringNo
requestIdquerystringNo
businessUnitIdquerystringNoOnly this business unit (GET /business-units), or "none" for records without one. Up to 100 characters.
todayquerystringNoA calendar date in the business's own calendar, YYYY-MM-DD.
limitqueryintegerNoPage size, 1–200. Default 50.
offsetqueryintegerNoRows to skip; the answer's total counts every match. Default 0.

Example

curl "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/quotes" \
  -H "Authorization: Bearer $SKUFLOW_API_KEY"

Response

200: the answer's fields
FieldTypeDescription
itemsarray of object
items[].idstringQuote id.
items[].organizationIdstring
items[].identifierstringQ-n, unique per organization.
items[].customerIdstring
items[].propertyIdstring or null
items[].requestIdstring or nullThe request it was made from.
items[].titlestring
items[].messagestring or nullShown to the customer.
items[].validUntilstring or nullYYYY-MM-DD; a sent quote expires after it.
items[].statusenumDRAFT → SENT (customer can answer at /q/{publicToken}) → APPROVED / CHANGES_REQUESTED / DECLINED; APPROVED → CONVERTED (invoice made). SENT past validUntil becomes EXPIRED. One of DRAFT, SENT, APPROVED, CHANGES_REQUESTED, DECLINED, CONVERTED, EXPIRED, ARCHIVED.
items[].taxRatenumberTax rate in percent.
items[].taxClothingRatenumber or nullPercent on CLOTHING lines; null = taxRate (some states tax apparel less).
items[].taxShippingRatenumber or nullPercent on SHIPPING lines; null = taxRate (0 where shipping is not taxed).
items[].taxDetailsanyHow the rate was decided: source EXEMPT (tax-exempt customer), MANUAL (typed), ADDRESS (the address's own rate), RULES (the business's tax rules for the ship-to address; rules lists them), UNIT, DEFAULT or NONE. Null on older records.
items[].depositPercentnumber or nullDeposit asked, as a percent of the total.
items[].depositCentsinteger or nullDeposit asked, as a fixed amount in cents.
items[].internalNotesstring or null
items[].publicTokenstringThe customer link token: the quote page is /q/{publicToken}.
items[].sentAtstring (date-time) or null
items[].approvedAtstring (date-time) or null
items[].approvedOptionIdstring or null
items[].approvedLineIdsarray of stringThe optional lines the customer kept.
items[].approvedTotalCentsinteger or nullApproved total in cents, with tax.
items[].approvedDepositCentsinteger or nullApproved deposit in cents.
items[].signatureNamestring or null
items[].approvedByStaffbooleanStaff recorded the approval for the customer.
items[].changesRequestedAtstring (date-time) or null
items[].changesRequestedNotestring or null
items[].declinedAtstring (date-time) or null
items[].declineReasonstring or null
items[].invoiceIdstring or nullThe invoice it was converted to.
items[].convertedAtstring (date-time) or null
items[].soldByUserIdstring or nullThe team member who sold it.
items[].financingDisabledboolean
items[].businessUnitIdstring or null
items[].customFieldsanyCustom field values by key (definitions: GET /custom-fields?entity=QUOTE).
items[].createdAtstring (date-time)
items[].updatedAtstring (date-time)
items[].customerobject
items[].customer.idstring
items[].customer.namestring
items[].businessUnitobject or nullThe business unit.
items[].businessUnit.idstring
items[].businessUnit.namestring
items[].propertyobject or null
items[].property.idstringProperty id.
items[].property.namestring or null
items[].property.addressstring or null
items[].property.citystring or null
items[].optionCountinteger
items[].totalCentsintegerThe approved total, else the lowest option's total (with tax), in integer cents.
totalintegerHow many match the filters, across all pages.

Create a draft quote

POST /organizations/{organizationId}/quotes

Creates a DRAFT quote (Q-n) for a customer with options and lines. Tax is 0 for tax-exempt customers, else taxRate, else decided for the ship-to address propertyId (its own rate, else the business's tax rules, else the unit's or the business default; taxDetails says how). Apparel lines take the clothing rate. Without options, one empty option is made. Nothing is sent: POST /quotes/{quoteId}/send marks it sent and the customer opens /q/{token}.

Permissionquotes.write (Owner, Admin, Staff)
Riskwrite, OAuth scope skuflow.write. Write: creates or changes records inside the business; nothing leaves it.
MCP toolquotes_create (toolset sales, in the default set)

Request body

FieldTypeRequiredDescription
customerIdstringYes
customFieldsobjectNoQuote custom field values (GET /custom-fields?entity=QUOTE); those marked visibleToCustomer print on the quote. Required ones are checked when the quote is created here.
propertyIdstring or nullNo
requestIdstring or nullNo
titlestring or nullNoUp to 500 characters.
messagestring or nullNo
validUntilempty string or string or nullNo
taxRatenumberNoPercent typed instead of the tax rules; omitted = decided for the ship-to address. -1000–1000.
depositPercentnumber or nullNo0–100.
depositCentsinteger or nullNo0–100000000.
internalNotesstring or nullNo
optionsarray of objectNoUp to 10 items.
options[].namestring or nullNoUp to 200 characters.
options[].descriptionstring or nullNoUp to 5000 characters.
options[].imageUrlstring or nullNoA picture of this option (e.g. a mockup), shown to the customer; else its first pricebook item's image. Up to 2000 characters.
options[].highlightsarray of stringNoFeature bullets compared side by side across options on the customer's page. Up to 12 items.
options[].warrantystring or nullNoA guarantee or note shown with this option. Up to 500 characters.
options[].recommendedbooleanNoMark as the recommended option.
options[].linesarray of objectYesUp to 200 items.
options[].lines[].descriptionstringNoRequired on a typed or pricebook line; written by the server for a product line.
options[].lines[].quantitynumberNo-1000000–1000000.
options[].lines[].unitPriceCentsintegerNoMoney in integer cents; negative for a discount or credit line. -100000000–100000000.
options[].lines[].optionalbooleanNo
options[].lines[].defaultSelectedbooleanNo
options[].lines[].pricebookItemIdstring or nullNoThe pricebook item the line was picked from (GET /pricebook/items): the server snapshots its cost; later pricebook edits never change this quote.
options[].lines[].productobject or nullNoA product with sizes × colours and a design (or a large-format size): priced by the server from the catalog and the decoration matrix and written as one line per set of sizes priced alike plus one per one-time fee. Send one product per decorated line; leave out the lines it wrote (same groupKey) when sending the quote back.
financingDisabledbooleanNoExposes to customers: true hides Affirm and Klarna ("or about $X/mo", pay the deposit over time) on this quote even when the business offers financing.
businessUnitIdstring or nullNoBusiness unit (GET /business-units): its branding shows on the quote. Omitted on create: the request's unit. Up to 100 characters.

Example

curl -X POST "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/quotes" \
  -H "Authorization: Bearer $SKUFLOW_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"customerId":"customer_id"}'

Response

201: the answer's fields
FieldTypeDescription
idstringQuote id.
organizationIdstring
identifierstringQ-n, unique per organization.
customerIdstring
propertyIdstring or null
requestIdstring or nullThe request it was made from.
titlestring
messagestring or nullShown to the customer.
validUntilstring or nullYYYY-MM-DD; a sent quote expires after it.
statusenumDRAFT → SENT (customer can answer at /q/{publicToken}) → APPROVED / CHANGES_REQUESTED / DECLINED; APPROVED → CONVERTED (invoice made). SENT past validUntil becomes EXPIRED. One of DRAFT, SENT, APPROVED, CHANGES_REQUESTED, DECLINED, CONVERTED, EXPIRED, ARCHIVED.
taxRatenumberTax rate in percent.
taxClothingRatenumber or nullPercent on CLOTHING lines; null = taxRate (some states tax apparel less).
taxShippingRatenumber or nullPercent on SHIPPING lines; null = taxRate (0 where shipping is not taxed).
taxDetailsanyHow the rate was decided: source EXEMPT (tax-exempt customer), MANUAL (typed), ADDRESS (the address's own rate), RULES (the business's tax rules for the ship-to address; rules lists them), UNIT, DEFAULT or NONE. Null on older records.
depositPercentnumber or nullDeposit asked, as a percent of the total.
depositCentsinteger or nullDeposit asked, as a fixed amount in cents.
internalNotesstring or null
publicTokenstringThe customer link token: the quote page is /q/{publicToken}.
sentAtstring (date-time) or null
approvedAtstring (date-time) or null
approvedOptionIdstring or null
approvedLineIdsarray of stringThe optional lines the customer kept.
approvedTotalCentsinteger or nullApproved total in cents, with tax.
approvedDepositCentsinteger or nullApproved deposit in cents.
signatureNamestring or null
approvedByStaffbooleanStaff recorded the approval for the customer.
changesRequestedAtstring (date-time) or null
changesRequestedNotestring or null
declinedAtstring (date-time) or null
declineReasonstring or null
invoiceIdstring or nullThe invoice it was converted to.
convertedAtstring (date-time) or null
soldByUserIdstring or nullThe team member who sold it.
financingDisabledboolean
businessUnitIdstring or null
customFieldsanyCustom field values by key (definitions: GET /custom-fields?entity=QUOTE).
createdAtstring (date-time)
updatedAtstring (date-time)

Get a quote with options, lines and totals

GET /organizations/{organizationId}/quotes/{quoteId}

One quote with its options, lines, totals, deposit, approval details and the customer link token (publicToken, for /q/{token}). Read-only.

Permissionquotes.read (Owner, Admin, Staff, Member)
Riskread, OAuth scope skuflow.read. Read: reads only.
MCP toolquotes_get (toolset sales, in the default set)

Parameters

NameInTypeRequiredDescription
quoteIdpathstringYes
todayquerystringNoA calendar date in the business's own calendar, YYYY-MM-DD.

Example

curl "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/quotes/{quoteId}" \
  -H "Authorization: Bearer $SKUFLOW_API_KEY"

Response

200: the answer's fields
FieldTypeDescription
idstringQuote id.
organizationIdstring
identifierstringQ-n, unique per organization.
customerIdstring
propertyIdstring or null
requestIdstring or nullThe request it was made from.
titlestring
messagestring or nullShown to the customer.
validUntilstring or nullYYYY-MM-DD; a sent quote expires after it.
statusenumDRAFT → SENT (customer can answer at /q/{publicToken}) → APPROVED / CHANGES_REQUESTED / DECLINED; APPROVED → CONVERTED (invoice made). SENT past validUntil becomes EXPIRED. One of DRAFT, SENT, APPROVED, CHANGES_REQUESTED, DECLINED, CONVERTED, EXPIRED, ARCHIVED.
taxRatenumberTax rate in percent.
taxClothingRatenumber or nullPercent on CLOTHING lines; null = taxRate (some states tax apparel less).
taxShippingRatenumber or nullPercent on SHIPPING lines; null = taxRate (0 where shipping is not taxed).
taxDetailsanyHow the rate was decided: source EXEMPT (tax-exempt customer), MANUAL (typed), ADDRESS (the address's own rate), RULES (the business's tax rules for the ship-to address; rules lists them), UNIT, DEFAULT or NONE. Null on older records.
depositPercentnumber or nullDeposit asked, as a percent of the total.
depositCentsinteger or nullDeposit asked, as a fixed amount in cents.
internalNotesstring or null
publicTokenstringThe customer link token: the quote page is /q/{publicToken}.
sentAtstring (date-time) or null
approvedAtstring (date-time) or null
approvedOptionIdstring or null
approvedLineIdsarray of stringThe optional lines the customer kept.
approvedTotalCentsinteger or nullApproved total in cents, with tax.
approvedDepositCentsinteger or nullApproved deposit in cents.
signatureNamestring or null
approvedByStaffbooleanStaff recorded the approval for the customer.
changesRequestedAtstring (date-time) or null
changesRequestedNotestring or null
declinedAtstring (date-time) or null
declineReasonstring or null
invoiceIdstring or nullThe invoice it was converted to.
convertedAtstring (date-time) or null
soldByUserIdstring or nullThe team member who sold it.
financingDisabledboolean
businessUnitIdstring or null
customFieldsanyCustom field values by key (definitions: GET /custom-fields?entity=QUOTE).
createdAtstring (date-time)
updatedAtstring (date-time)
customerobject
customer.idstring
customer.namestring
customer.emailstring or null
customer.phonestring or null
customer.addressstring or null
customer.citystring or null
customer.statestring or null
customer.zipstring or null
customer.taxExemptboolean
propertyobject or null
property.idstringProperty id.
property.namestring or null
property.addressstring or null
property.citystring or null
property.statestring or null
property.zipstring or null
property.taxRatenumber or null
requestobject or null
request.idstring
request.identifierstringREQ-n
request.statusenumNEW → QUOTED → CONVERTED (its quote was invoiced), or ARCHIVED. One of NEW, QUOTED, CONVERTED, ARCHIVED.
invoiceobject or null
invoice.idstring
invoice.identifierstringINV-n
invoice.statusenumDRAFT (not issued), SENT (issued, money due), PAID, OVERDUE (past dueDate) or CANCELLED. One of DRAFT, SENT, PAID, OVERDUE, CANCELLED.
invoice.totalCentsinteger
optionsarray of object
options[].idstringQuote option id (for optionId).
options[].quoteIdstring
options[].namestring
options[].descriptionstring or null
options[].sortOrderinteger
options[].imageUrlstring or null
options[].highlightsarray of string
options[].warrantystring or null
options[].recommendedboolean
options[].linesarray of object
options[].lines[].idstringQuote line id (for selectedLineIds).
options[].lines[].optionIdstring
options[].lines[].descriptionstring
options[].lines[].quantitynumber
options[].lines[].unitPriceCentsintegerUnit price, in integer cents.
options[].lines[].optionalbooleanThe customer may leave it out.
options[].lines[].defaultSelectedbooleanAn optional line's default.
options[].lines[].sortOrderinteger
options[].lines[].pricebookItemIdstring or null
options[].lines[].costCentsinteger or nullOur unit cost in cents (costing.read only).
options[].lines[].kindenumSTANDARD (typed or pricebook), PRODUCT (sizes priced alike of a product line), LARGE_FORMAT or DECORATION_FEE (a one-time fee of a decorated line). One of STANDARD, PRODUCT, LARGE_FORMAT, DECORATION_FEE.
options[].lines[].groupKeystring or nullA decorated line's lines share it; send the line's product input once instead of them.
options[].lines[].productIdstring or null
options[].lines[].productVariantIdstring or null
options[].lines[].designIdstring or null
options[].lines[].pricinganyThe pricing snapshot: on the first line of a group, input (the product line to send back to keep or change it) and result (sizes, decoration per location, fees).
options[].lines[].taxClassenumWhich rate taxes the line: STANDARD, CLOTHING (apparel), SHIPPING or EXEMPT (set by the server). One of STANDARD, CLOTHING, SHIPPING, EXEMPT.
options[].totalsobjectThe option's totals in cents with its default lines.
options[].totals.lineTotalsarray of integer
options[].totals.includedarray of boolean
options[].totals.subtotalCentsinteger
options[].totals.taxCentsinteger
options[].totals.totalCentsinteger
options[].totals.depositCentsinteger
designsanyThe designs on the quote's lines with their current mockups (signed links); proofs: GET /quotes/{quoteId}/proofs.
approvalSnapshotanyWhat the customer approved (option, lines, totals), frozen at approval; null before.

Update a quote

PATCH /organizations/{organizationId}/quotes/{quoteId}

Changes the fields sent, until the customer decides. options replaces every option and line (send them all). Moving an expired quote's date forward re-opens it.

Permissionquotes.write (Owner, Admin, Staff)
Riskwrite, OAuth scope skuflow.write. Write: creates or changes records inside the business; nothing leaves it.
MCP toolquotes_update (toolset sales, in the default set)

Parameters

NameInTypeRequiredDescription
quoteIdpathstringYes

Request body

FieldTypeRequiredDescription
customerIdstringNo
customFieldsobjectNoQuote custom field values (GET /custom-fields?entity=QUOTE); those marked visibleToCustomer print on the quote. Required ones are checked when the quote is created here.
propertyIdstring or nullNo
requestIdstring or nullNo
titlestring or nullNoUp to 500 characters.
messagestring or nullNo
validUntilempty string or string or nullNo
taxRatenumberNoPercent typed instead of the tax rules; omitted = decided for the ship-to address. -1000–1000.
depositPercentnumber or nullNo0–100.
depositCentsinteger or nullNo0–100000000.
internalNotesstring or nullNo
optionsarray of objectNoUp to 10 items.
options[].namestring or nullNoUp to 200 characters.
options[].descriptionstring or nullNoUp to 5000 characters.
options[].imageUrlstring or nullNoA picture of this option (e.g. a mockup), shown to the customer; else its first pricebook item's image. Up to 2000 characters.
options[].highlightsarray of stringNoFeature bullets compared side by side across options on the customer's page. Up to 12 items.
options[].warrantystring or nullNoA guarantee or note shown with this option. Up to 500 characters.
options[].recommendedbooleanNoMark as the recommended option.
options[].linesarray of objectYesUp to 200 items.
options[].lines[].descriptionstringNoRequired on a typed or pricebook line; written by the server for a product line.
options[].lines[].quantitynumberNo-1000000–1000000.
options[].lines[].unitPriceCentsintegerNoMoney in integer cents; negative for a discount or credit line. -100000000–100000000.
options[].lines[].optionalbooleanNo
options[].lines[].defaultSelectedbooleanNo
options[].lines[].pricebookItemIdstring or nullNoThe pricebook item the line was picked from (GET /pricebook/items): the server snapshots its cost; later pricebook edits never change this quote.
options[].lines[].productobject or nullNoA product with sizes × colours and a design (or a large-format size): priced by the server from the catalog and the decoration matrix and written as one line per set of sizes priced alike plus one per one-time fee. Send one product per decorated line; leave out the lines it wrote (same groupKey) when sending the quote back.
financingDisabledbooleanNoExposes to customers: true hides Affirm and Klarna ("or about $X/mo", pay the deposit over time) on this quote even when the business offers financing.
businessUnitIdstring or nullNoBusiness unit (GET /business-units): its branding shows on the quote. Omitted on create: the request's unit. Up to 100 characters.
todaystringNoA calendar date in the business's own calendar, YYYY-MM-DD.

Example

curl -X PATCH "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/quotes/{quoteId}" \
  -H "Authorization: Bearer $SKUFLOW_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"customerId":"customer_id","customFields":{},"propertyId":"property_id"}'

Response

200: the answer's fields
FieldTypeDescription
idstringQuote id.
organizationIdstring
identifierstringQ-n, unique per organization.
customerIdstring
propertyIdstring or null
requestIdstring or nullThe request it was made from.
titlestring
messagestring or nullShown to the customer.
validUntilstring or nullYYYY-MM-DD; a sent quote expires after it.
statusenumDRAFT → SENT (customer can answer at /q/{publicToken}) → APPROVED / CHANGES_REQUESTED / DECLINED; APPROVED → CONVERTED (invoice made). SENT past validUntil becomes EXPIRED. One of DRAFT, SENT, APPROVED, CHANGES_REQUESTED, DECLINED, CONVERTED, EXPIRED, ARCHIVED.
taxRatenumberTax rate in percent.
taxClothingRatenumber or nullPercent on CLOTHING lines; null = taxRate (some states tax apparel less).
taxShippingRatenumber or nullPercent on SHIPPING lines; null = taxRate (0 where shipping is not taxed).
taxDetailsanyHow the rate was decided: source EXEMPT (tax-exempt customer), MANUAL (typed), ADDRESS (the address's own rate), RULES (the business's tax rules for the ship-to address; rules lists them), UNIT, DEFAULT or NONE. Null on older records.
depositPercentnumber or nullDeposit asked, as a percent of the total.
depositCentsinteger or nullDeposit asked, as a fixed amount in cents.
internalNotesstring or null
publicTokenstringThe customer link token: the quote page is /q/{publicToken}.
sentAtstring (date-time) or null
approvedAtstring (date-time) or null
approvedOptionIdstring or null
approvedLineIdsarray of stringThe optional lines the customer kept.
approvedTotalCentsinteger or nullApproved total in cents, with tax.
approvedDepositCentsinteger or nullApproved deposit in cents.
signatureNamestring or null
approvedByStaffbooleanStaff recorded the approval for the customer.
changesRequestedAtstring (date-time) or null
changesRequestedNotestring or null
declinedAtstring (date-time) or null
declineReasonstring or null
invoiceIdstring or nullThe invoice it was converted to.
convertedAtstring (date-time) or null
soldByUserIdstring or nullThe team member who sold it.
financingDisabledboolean
businessUnitIdstring or null
customFieldsanyCustom field values by key (definitions: GET /custom-fields?entity=QUOTE).
createdAtstring (date-time)
updatedAtstring (date-time)

Delete a quote

DELETE /organizations/{organizationId}/quotes/{quoteId}

Destructive: deletes the quote with its options and lines; its customer link stops working. Deposits taken on it stay as payments, no longer linked to a quote. Prefer archiving (POST /quotes/{quoteId}/archive).

Permissionquotes.delete (Owner, Admin)
Risksensitive, OAuth scope skuflow.sensitive. Sensitive: moves money, deletes, sends or shows something to a customer, or grants or revokes access.
MCP toolquotes_delete (toolset sales)
ApprovalOver MCP, this tool always waits for your approval in SKUFlow. See Approvals.

Parameters

NameInTypeRequiredDescription
quoteIdpathstringYes

Example

curl -X DELETE "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/quotes/{quoteId}" \
  -H "Authorization: Bearer $SKUFLOW_API_KEY"

Response

200: the answer's fields
FieldTypeDescription
oktrue

Update a quote's tax

POST /organizations/{organizationId}/quotes/{quoteId}/tax

Taxes a quote the customer has not decided on again: for its ship-to address under the business's current tax rules, or at taxRate when given. Changes its totals (the customer sees them on /q/{token} if it was sent); 409 once approved, declined or converted. Answers the quote with taxDetails.

Permissionquotes.write (Owner, Admin, Staff)
Riskwrite, OAuth scope skuflow.write. Write: creates or changes records inside the business; nothing leaves it.
MCP toolquotes_refreshTax (toolset sales)

Parameters

NameInTypeRequiredDescription
quoteIdpathstringYes

Request body

FieldTypeRequiredDescription
taxRatenumberNoPercent typed instead of the tax rules. 0–100.

Example

curl -X POST "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/quotes/{quoteId}/tax" \
  -H "Authorization: Bearer $SKUFLOW_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"taxRate":1}'

Response

200: the answer's fields
FieldTypeDescription
idstringQuote id.
organizationIdstring
identifierstringQ-n, unique per organization.
customerIdstring
propertyIdstring or null
requestIdstring or nullThe request it was made from.
titlestring
messagestring or nullShown to the customer.
validUntilstring or nullYYYY-MM-DD; a sent quote expires after it.
statusenumDRAFT → SENT (customer can answer at /q/{publicToken}) → APPROVED / CHANGES_REQUESTED / DECLINED; APPROVED → CONVERTED (invoice made). SENT past validUntil becomes EXPIRED. One of DRAFT, SENT, APPROVED, CHANGES_REQUESTED, DECLINED, CONVERTED, EXPIRED, ARCHIVED.
taxRatenumberTax rate in percent.
taxClothingRatenumber or nullPercent on CLOTHING lines; null = taxRate (some states tax apparel less).
taxShippingRatenumber or nullPercent on SHIPPING lines; null = taxRate (0 where shipping is not taxed).
taxDetailsanyHow the rate was decided: source EXEMPT (tax-exempt customer), MANUAL (typed), ADDRESS (the address's own rate), RULES (the business's tax rules for the ship-to address; rules lists them), UNIT, DEFAULT or NONE. Null on older records.
depositPercentnumber or nullDeposit asked, as a percent of the total.
depositCentsinteger or nullDeposit asked, as a fixed amount in cents.
internalNotesstring or null
publicTokenstringThe customer link token: the quote page is /q/{publicToken}.
sentAtstring (date-time) or null
approvedAtstring (date-time) or null
approvedOptionIdstring or null
approvedLineIdsarray of stringThe optional lines the customer kept.
approvedTotalCentsinteger or nullApproved total in cents, with tax.
approvedDepositCentsinteger or nullApproved deposit in cents.
signatureNamestring or null
approvedByStaffbooleanStaff recorded the approval for the customer.
changesRequestedAtstring (date-time) or null
changesRequestedNotestring or null
declinedAtstring (date-time) or null
declineReasonstring or null
invoiceIdstring or nullThe invoice it was converted to.
convertedAtstring (date-time) or null
soldByUserIdstring or nullThe team member who sold it.
financingDisabledboolean
businessUnitIdstring or null
customFieldsanyCustom field values by key (definitions: GET /custom-fields?entity=QUOTE).
createdAtstring (date-time)
updatedAtstring (date-time)
customerobject
customer.idstring
customer.namestring
customer.emailstring or null
customer.phonestring or null
customer.addressstring or null
customer.citystring or null
customer.statestring or null
customer.zipstring or null
customer.taxExemptboolean
propertyobject or null
property.idstringProperty id.
property.namestring or null
property.addressstring or null
property.citystring or null
property.statestring or null
property.zipstring or null
property.taxRatenumber or null
requestobject or null
request.idstring
request.identifierstringREQ-n
request.statusenumNEW → QUOTED → CONVERTED (its quote was invoiced), or ARCHIVED. One of NEW, QUOTED, CONVERTED, ARCHIVED.
invoiceobject or null
invoice.idstring
invoice.identifierstringINV-n
invoice.statusenumDRAFT (not issued), SENT (issued, money due), PAID, OVERDUE (past dueDate) or CANCELLED. One of DRAFT, SENT, PAID, OVERDUE, CANCELLED.
invoice.totalCentsinteger
optionsarray of object
options[].idstringQuote option id (for optionId).
options[].quoteIdstring
options[].namestring
options[].descriptionstring or null
options[].sortOrderinteger
options[].imageUrlstring or null
options[].highlightsarray of string
options[].warrantystring or null
options[].recommendedboolean
options[].linesarray of object
options[].lines[].idstringQuote line id (for selectedLineIds).
options[].lines[].optionIdstring
options[].lines[].descriptionstring
options[].lines[].quantitynumber
options[].lines[].unitPriceCentsintegerUnit price, in integer cents.
options[].lines[].optionalbooleanThe customer may leave it out.
options[].lines[].defaultSelectedbooleanAn optional line's default.
options[].lines[].sortOrderinteger
options[].lines[].pricebookItemIdstring or null
options[].lines[].costCentsinteger or nullOur unit cost in cents (costing.read only).
options[].lines[].kindenumSTANDARD (typed or pricebook), PRODUCT (sizes priced alike of a product line), LARGE_FORMAT or DECORATION_FEE (a one-time fee of a decorated line). One of STANDARD, PRODUCT, LARGE_FORMAT, DECORATION_FEE.
options[].lines[].groupKeystring or nullA decorated line's lines share it; send the line's product input once instead of them.
options[].lines[].productIdstring or null
options[].lines[].productVariantIdstring or null
options[].lines[].designIdstring or null
options[].lines[].pricinganyThe pricing snapshot: on the first line of a group, input (the product line to send back to keep or change it) and result (sizes, decoration per location, fees).
options[].lines[].taxClassenumWhich rate taxes the line: STANDARD, CLOTHING (apparel), SHIPPING or EXEMPT (set by the server). One of STANDARD, CLOTHING, SHIPPING, EXEMPT.
options[].totalsobjectThe option's totals in cents with its default lines.
options[].totals.lineTotalsarray of integer
options[].totals.includedarray of boolean
options[].totals.subtotalCentsinteger
options[].totals.taxCentsinteger
options[].totals.totalCentsinteger
options[].totals.depositCentsinteger
designsanyThe designs on the quote's lines with their current mockups (signed links); proofs: GET /quotes/{quoteId}/proofs.
approvalSnapshotanyWhat the customer approved (option, lines, totals), frozen at approval; null before.

Mark a quote as sent

POST /organizations/{organizationId}/quotes/{quoteId}/send

Sends to the customer: marks the quote SENT (records sentAt), which opens its customer page /q/{token} for approval. Nothing is emailed; share the link from GET /quotes/{quoteId}.

Permissionquotes.send (Owner, Admin, Staff)
Risksensitive, OAuth scope skuflow.sensitive. Sensitive: moves money, deletes, sends or shows something to a customer, or grants or revokes access.
MCP toolquotes_send (toolset sales, in the default set)
ApprovalOver MCP, this tool asks for your OK first (in the AI app when it supports it, otherwise in SKUFlow). See Approvals.

Parameters

NameInTypeRequiredDescription
quoteIdpathstringYes

Request body

FieldTypeRequiredDescription
todaystringNoA calendar date in the business's own calendar, YYYY-MM-DD.

Example

curl -X POST "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/quotes/{quoteId}/send" \
  -H "Authorization: Bearer $SKUFLOW_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"today":"2026-11-03"}'

Response

200: the answer's fields
FieldTypeDescription
idstringQuote id.
organizationIdstring
identifierstringQ-n, unique per organization.
customerIdstring
propertyIdstring or null
requestIdstring or nullThe request it was made from.
titlestring
messagestring or nullShown to the customer.
validUntilstring or nullYYYY-MM-DD; a sent quote expires after it.
statusenumDRAFT → SENT (customer can answer at /q/{publicToken}) → APPROVED / CHANGES_REQUESTED / DECLINED; APPROVED → CONVERTED (invoice made). SENT past validUntil becomes EXPIRED. One of DRAFT, SENT, APPROVED, CHANGES_REQUESTED, DECLINED, CONVERTED, EXPIRED, ARCHIVED.
taxRatenumberTax rate in percent.
taxClothingRatenumber or nullPercent on CLOTHING lines; null = taxRate (some states tax apparel less).
taxShippingRatenumber or nullPercent on SHIPPING lines; null = taxRate (0 where shipping is not taxed).
taxDetailsanyHow the rate was decided: source EXEMPT (tax-exempt customer), MANUAL (typed), ADDRESS (the address's own rate), RULES (the business's tax rules for the ship-to address; rules lists them), UNIT, DEFAULT or NONE. Null on older records.
depositPercentnumber or nullDeposit asked, as a percent of the total.
depositCentsinteger or nullDeposit asked, as a fixed amount in cents.
internalNotesstring or null
publicTokenstringThe customer link token: the quote page is /q/{publicToken}.
sentAtstring (date-time) or null
approvedAtstring (date-time) or null
approvedOptionIdstring or null
approvedLineIdsarray of stringThe optional lines the customer kept.
approvedTotalCentsinteger or nullApproved total in cents, with tax.
approvedDepositCentsinteger or nullApproved deposit in cents.
signatureNamestring or null
approvedByStaffbooleanStaff recorded the approval for the customer.
changesRequestedAtstring (date-time) or null
changesRequestedNotestring or null
declinedAtstring (date-time) or null
declineReasonstring or null
invoiceIdstring or nullThe invoice it was converted to.
convertedAtstring (date-time) or null
soldByUserIdstring or nullThe team member who sold it.
financingDisabledboolean
businessUnitIdstring or null
customFieldsanyCustom field values by key (definitions: GET /custom-fields?entity=QUOTE).
createdAtstring (date-time)
updatedAtstring (date-time)

Approve on the customer's behalf

POST /organizations/{organizationId}/quotes/{quoteId}/approve

Acts for the customer: records the customer's approval (e.g. given by phone) of one option; the quote becomes APPROVED and can be converted to an invoice and take deposits. selectedLineIds are the optional lines kept; omitted means their defaults. Stores the terms the customer was shown (terms, else the business's current quote terms) and, when they signed on the device, signatureDataUrl. Get option and line ids from GET /quotes/{quoteId}.

Permissionquotes.approve (Owner, Admin, Staff)
Risksensitive, OAuth scope skuflow.sensitive. Sensitive: moves money, deletes, sends or shows something to a customer, or grants or revokes access.
MCP toolquotes_approve (toolset sales)
ApprovalOver MCP, this tool asks for your OK first (in the AI app when it supports it, otherwise in SKUFlow). See Approvals.

Parameters

NameInTypeRequiredDescription
quoteIdpathstringYes

Request body

FieldTypeRequiredDescription
optionIdstringNo
selectedLineIdsarray of stringNoUp to 200 items.
signatureNamestring or nullNoUp to 200 characters.
termsstring or nullNoThe terms shown to the customer (GET /signing-terms resolved.quoteTerms); omitted: the business's current ones. Up to 5000 characters.
signatureDataUrlstring or nullNoThe customer's signature drawn on the device: a data:image/png;base64 URL.

Example

curl -X POST "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/quotes/{quoteId}/approve" \
  -H "Authorization: Bearer $SKUFLOW_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"optionId":"option_id","selectedLineIds":["selectedLine_id"],"signatureName":"string"}'

Response

200: the answer's fields
FieldTypeDescription
idstringQuote id.
organizationIdstring
identifierstringQ-n, unique per organization.
customerIdstring
propertyIdstring or null
requestIdstring or nullThe request it was made from.
titlestring
messagestring or nullShown to the customer.
validUntilstring or nullYYYY-MM-DD; a sent quote expires after it.
statusenumDRAFT → SENT (customer can answer at /q/{publicToken}) → APPROVED / CHANGES_REQUESTED / DECLINED; APPROVED → CONVERTED (invoice made). SENT past validUntil becomes EXPIRED. One of DRAFT, SENT, APPROVED, CHANGES_REQUESTED, DECLINED, CONVERTED, EXPIRED, ARCHIVED.
taxRatenumberTax rate in percent.
taxClothingRatenumber or nullPercent on CLOTHING lines; null = taxRate (some states tax apparel less).
taxShippingRatenumber or nullPercent on SHIPPING lines; null = taxRate (0 where shipping is not taxed).
taxDetailsanyHow the rate was decided: source EXEMPT (tax-exempt customer), MANUAL (typed), ADDRESS (the address's own rate), RULES (the business's tax rules for the ship-to address; rules lists them), UNIT, DEFAULT or NONE. Null on older records.
depositPercentnumber or nullDeposit asked, as a percent of the total.
depositCentsinteger or nullDeposit asked, as a fixed amount in cents.
internalNotesstring or null
publicTokenstringThe customer link token: the quote page is /q/{publicToken}.
sentAtstring (date-time) or null
approvedAtstring (date-time) or null
approvedOptionIdstring or null
approvedLineIdsarray of stringThe optional lines the customer kept.
approvedTotalCentsinteger or nullApproved total in cents, with tax.
approvedDepositCentsinteger or nullApproved deposit in cents.
signatureNamestring or null
approvedByStaffbooleanStaff recorded the approval for the customer.
changesRequestedAtstring (date-time) or null
changesRequestedNotestring or null
declinedAtstring (date-time) or null
declineReasonstring or null
invoiceIdstring or nullThe invoice it was converted to.
convertedAtstring (date-time) or null
soldByUserIdstring or nullThe team member who sold it.
financingDisabledboolean
businessUnitIdstring or null
customFieldsanyCustom field values by key (definitions: GET /custom-fields?entity=QUOTE).
createdAtstring (date-time)
updatedAtstring (date-time)

Archive a quote

POST /organizations/{organizationId}/quotes/{quoteId}/archive

Moves the quote to ARCHIVED: out of the open lists, kept for the record. Its customer link stops accepting answers.

Permissionquotes.write (Owner, Admin, Staff)
Riskwrite, OAuth scope skuflow.write. Write: creates or changes records inside the business; nothing leaves it.
MCP toolquotes_archive (toolset sales)

Parameters

NameInTypeRequiredDescription
quoteIdpathstringYes

Example

curl -X POST "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/quotes/{quoteId}/archive" \
  -H "Authorization: Bearer $SKUFLOW_API_KEY"

Response

200: the answer's fields
FieldTypeDescription
idstringQuote id.
organizationIdstring
identifierstringQ-n, unique per organization.
customerIdstring
propertyIdstring or null
requestIdstring or nullThe request it was made from.
titlestring
messagestring or nullShown to the customer.
validUntilstring or nullYYYY-MM-DD; a sent quote expires after it.
statusenumDRAFT → SENT (customer can answer at /q/{publicToken}) → APPROVED / CHANGES_REQUESTED / DECLINED; APPROVED → CONVERTED (invoice made). SENT past validUntil becomes EXPIRED. One of DRAFT, SENT, APPROVED, CHANGES_REQUESTED, DECLINED, CONVERTED, EXPIRED, ARCHIVED.
taxRatenumberTax rate in percent.
taxClothingRatenumber or nullPercent on CLOTHING lines; null = taxRate (some states tax apparel less).
taxShippingRatenumber or nullPercent on SHIPPING lines; null = taxRate (0 where shipping is not taxed).
taxDetailsanyHow the rate was decided: source EXEMPT (tax-exempt customer), MANUAL (typed), ADDRESS (the address's own rate), RULES (the business's tax rules for the ship-to address; rules lists them), UNIT, DEFAULT or NONE. Null on older records.
depositPercentnumber or nullDeposit asked, as a percent of the total.
depositCentsinteger or nullDeposit asked, as a fixed amount in cents.
internalNotesstring or null
publicTokenstringThe customer link token: the quote page is /q/{publicToken}.
sentAtstring (date-time) or null
approvedAtstring (date-time) or null
approvedOptionIdstring or null
approvedLineIdsarray of stringThe optional lines the customer kept.
approvedTotalCentsinteger or nullApproved total in cents, with tax.
approvedDepositCentsinteger or nullApproved deposit in cents.
signatureNamestring or null
approvedByStaffbooleanStaff recorded the approval for the customer.
changesRequestedAtstring (date-time) or null
changesRequestedNotestring or null
declinedAtstring (date-time) or null
declineReasonstring or null
invoiceIdstring or nullThe invoice it was converted to.
convertedAtstring (date-time) or null
soldByUserIdstring or nullThe team member who sold it.
financingDisabledboolean
businessUnitIdstring or null
customFieldsanyCustom field values by key (definitions: GET /custom-fields?entity=QUOTE).
createdAtstring (date-time)
updatedAtstring (date-time)

Duplicate a quote as a new draft

POST /organizations/{organizationId}/quotes/{quoteId}/duplicate

Copies the quote's options and lines into a new DRAFT quote (new Q-n, new link) for the same customer. Returns the new quote.

Permissionquotes.write (Owner, Admin, Staff)
Riskwrite, OAuth scope skuflow.write. Write: creates or changes records inside the business; nothing leaves it.
MCP toolquotes_duplicate (toolset sales)

Parameters

NameInTypeRequiredDescription
quoteIdpathstringYes

Example

curl -X POST "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/quotes/{quoteId}/duplicate" \
  -H "Authorization: Bearer $SKUFLOW_API_KEY"

Response

201: the answer's fields
FieldTypeDescription
idstringQuote id.
organizationIdstring
identifierstringQ-n, unique per organization.
customerIdstring
propertyIdstring or null
requestIdstring or nullThe request it was made from.
titlestring
messagestring or nullShown to the customer.
validUntilstring or nullYYYY-MM-DD; a sent quote expires after it.
statusenumDRAFT → SENT (customer can answer at /q/{publicToken}) → APPROVED / CHANGES_REQUESTED / DECLINED; APPROVED → CONVERTED (invoice made). SENT past validUntil becomes EXPIRED. One of DRAFT, SENT, APPROVED, CHANGES_REQUESTED, DECLINED, CONVERTED, EXPIRED, ARCHIVED.
taxRatenumberTax rate in percent.
taxClothingRatenumber or nullPercent on CLOTHING lines; null = taxRate (some states tax apparel less).
taxShippingRatenumber or nullPercent on SHIPPING lines; null = taxRate (0 where shipping is not taxed).
taxDetailsanyHow the rate was decided: source EXEMPT (tax-exempt customer), MANUAL (typed), ADDRESS (the address's own rate), RULES (the business's tax rules for the ship-to address; rules lists them), UNIT, DEFAULT or NONE. Null on older records.
depositPercentnumber or nullDeposit asked, as a percent of the total.
depositCentsinteger or nullDeposit asked, as a fixed amount in cents.
internalNotesstring or null
publicTokenstringThe customer link token: the quote page is /q/{publicToken}.
sentAtstring (date-time) or null
approvedAtstring (date-time) or null
approvedOptionIdstring or null
approvedLineIdsarray of stringThe optional lines the customer kept.
approvedTotalCentsinteger or nullApproved total in cents, with tax.
approvedDepositCentsinteger or nullApproved deposit in cents.
signatureNamestring or null
approvedByStaffbooleanStaff recorded the approval for the customer.
changesRequestedAtstring (date-time) or null
changesRequestedNotestring or null
declinedAtstring (date-time) or null
declineReasonstring or null
invoiceIdstring or nullThe invoice it was converted to.
convertedAtstring (date-time) or null
soldByUserIdstring or nullThe team member who sold it.
financingDisabledboolean
businessUnitIdstring or null
customFieldsanyCustom field values by key (definitions: GET /custom-fields?entity=QUOTE).
createdAtstring (date-time)
updatedAtstring (date-time)
POST /organizations/{organizationId}/quotes/{quoteId}/link

REVOKES / EXPOSES: issues a new customer link token; the previous /q/{token} link stops working at once. Returns the quote.

Permissionquotes.send (Owner, Admin, Staff)
Risksensitive, OAuth scope skuflow.sensitive. Sensitive: moves money, deletes, sends or shows something to a customer, or grants or revokes access.
MCP toolquotes_regenerateLink (toolset sales)
ApprovalOver MCP, this tool asks for your OK first (in the AI app when it supports it, otherwise in SKUFlow). See Approvals.

Parameters

NameInTypeRequiredDescription
quoteIdpathstringYes

Example

curl -X POST "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/quotes/{quoteId}/link" \
  -H "Authorization: Bearer $SKUFLOW_API_KEY"

Response

200: the answer's fields
FieldTypeDescription
idstringQuote id.
organizationIdstring
identifierstringQ-n, unique per organization.
customerIdstring
propertyIdstring or null
requestIdstring or nullThe request it was made from.
titlestring
messagestring or nullShown to the customer.
validUntilstring or nullYYYY-MM-DD; a sent quote expires after it.
statusenumDRAFT → SENT (customer can answer at /q/{publicToken}) → APPROVED / CHANGES_REQUESTED / DECLINED; APPROVED → CONVERTED (invoice made). SENT past validUntil becomes EXPIRED. One of DRAFT, SENT, APPROVED, CHANGES_REQUESTED, DECLINED, CONVERTED, EXPIRED, ARCHIVED.
taxRatenumberTax rate in percent.
taxClothingRatenumber or nullPercent on CLOTHING lines; null = taxRate (some states tax apparel less).
taxShippingRatenumber or nullPercent on SHIPPING lines; null = taxRate (0 where shipping is not taxed).
taxDetailsanyHow the rate was decided: source EXEMPT (tax-exempt customer), MANUAL (typed), ADDRESS (the address's own rate), RULES (the business's tax rules for the ship-to address; rules lists them), UNIT, DEFAULT or NONE. Null on older records.
depositPercentnumber or nullDeposit asked, as a percent of the total.
depositCentsinteger or nullDeposit asked, as a fixed amount in cents.
internalNotesstring or null
publicTokenstringThe customer link token: the quote page is /q/{publicToken}.
sentAtstring (date-time) or null
approvedAtstring (date-time) or null
approvedOptionIdstring or null
approvedLineIdsarray of stringThe optional lines the customer kept.
approvedTotalCentsinteger or nullApproved total in cents, with tax.
approvedDepositCentsinteger or nullApproved deposit in cents.
signatureNamestring or null
approvedByStaffbooleanStaff recorded the approval for the customer.
changesRequestedAtstring (date-time) or null
changesRequestedNotestring or null
declinedAtstring (date-time) or null
declineReasonstring or null
invoiceIdstring or nullThe invoice it was converted to.
convertedAtstring (date-time) or null
soldByUserIdstring or nullThe team member who sold it.
financingDisabledboolean
businessUnitIdstring or null
customFieldsanyCustom field values by key (definitions: GET /custom-fields?entity=QUOTE).
createdAtstring (date-time)
updatedAtstring (date-time)

Convert an approved quote to an invoice

POST /organizations/{organizationId}/quotes/{quoteId}/invoice

Creates a DRAFT invoice with the approved lines, through the normal invoice rules; the quote becomes CONVERTED (and its request too); deposits paid on the quote move onto it and count as paid. Nothing is sent. Returns the invoice.

Permissioninvoices.write (Owner, Admin, Staff)
Riskwrite, OAuth scope skuflow.write. Write: creates or changes records inside the business; nothing leaves it.
MCP toolquotes_convertToInvoice (toolset sales, in the default set)

Parameters

NameInTypeRequiredDescription
quoteIdpathstringYes

Example

curl -X POST "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/quotes/{quoteId}/invoice" \
  -H "Authorization: Bearer $SKUFLOW_API_KEY"

Response

201: the answer's fields
FieldTypeDescription
idstringInvoice id.
organizationIdstring
identifierstringINV-n, unique per organization.
customerIdstring
statusenumDRAFT (not issued), SENT (issued, money due), PAID, OVERDUE (past dueDate) or CANCELLED. One of DRAFT, SENT, PAID, OVERDUE, CANCELLED.
subtotalCentsintegerLines total before tax, in integer cents.
taxRatenumberTax rate in percent.
taxClothingRatenumber or nullPercent on CLOTHING lines; null = taxRate (some states tax apparel less).
taxShippingRatenumber or nullPercent on SHIPPING lines; null = taxRate (0 where shipping is not taxed).
taxDetailsanyHow the rate was decided: source EXEMPT (tax-exempt customer), MANUAL (typed), ADDRESS (the address's own rate), RULES (the business's tax rules for the ship-to address; rules lists them), UNIT, DEFAULT or NONE. Null on older records.
taxCentsintegerTax, in integer cents.
totalCentsintegerTotal with tax, in integer cents.
propertyIdstring or nullThe ship-to address (a property of the customer); its tax rules decide the rate.
notesstring or null
dueDatestring or nullYYYY-MM-DD
paidDatestring or nullYYYY-MM-DD
amountPaidCentsintegerPaid so far, net of refunds, tips excluded, in integer cents.
financingDisabledboolean
importLockedbooleanImported paid history: read-only, its amounts never change.
businessUnitIdstring or null
customFieldsanyCustom field values by key (definitions: GET /custom-fields?entity=INVOICE).
createdAtstring (date-time)
updatedAtstring (date-time)
customerobject
customer.idstring
customer.namestring
businessUnitobject or nullThe business unit.
businessUnit.idstring
businessUnit.namestring
propertyobject or nullThe ship-to address.
property.idstringProperty id.
property.namestring or null
property.addressstring or null
property.citystring or null
property.countystring or null
property.statestring or null
property.zipstring or null
property.countrystring or null
balanceDueCentsintegerStill due, in integer cents.
partiallyPaidboolean

Price a product line before adding it to a quote

GET /organizations/{organizationId}/quotes/price-line

What a product line would cost (the quote builder's live price): the quote lines it becomes (sizes priced alike, fees), per-location decoration and the totals; ok: false with problems when the matrix can't price it as asked. breakQuantity reads the matrix at a larger quantity (the design's total on the option). Read-only: add it to a quote with options[].lines[].product.

Permissionquotes.read (Owner, Admin, Staff, Member)
Riskread, OAuth scope skuflow.read. Read: reads only.
MCP toolquotes_priceLine (toolset sales)

Parameters

NameInTypeRequiredDescription
productqueryobjectYesA product line: the server prices blanks + decoration from the matrix and writes a line per set of sizes priced alike, then one line per one-time fee.
breakQuantityqueryintegerNo0–1000000.
includeFeesqueryboolean or enumNo

Example

curl "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/quotes/price-line?product=%5Bobject%20Object%5D" \
  -H "Authorization: Bearer $SKUFLOW_API_KEY"

Response

200: the answer's fields
FieldTypeDescription
okbooleanFalse when the decoration matrix can't price it (see problems); lines is then empty.
problemsarray of stringWhy it can't be priced as asked (e.g. more colours than the table prices).
linesanyThe quote lines it becomes: description, quantity, unit price, kind (PRODUCT, LARGE_FORMAT, DECORATION_FEE) and (with costing.read) unit cost.
resultanyThe priced result: groups, placements, fees (or the large-format breakdown) and totals.

List a quote's proofs

GET /organizations/{organizationId}/quotes/{quoteId}/proofs

Every proof version of the quote's designs (newest first per design) with mockups, status, comments and the customer's decision (name, time and, for staff, address and browser). Read-only.

Permissionquotes.read (Owner, Admin, Staff, Member)
Riskread, OAuth scope skuflow.read. Read: reads only.
MCP toolproofs_list (toolset sales)

Parameters

NameInTypeRequiredDescription
quoteIdpathstringYes

Example

curl "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/quotes/{quoteId}/proofs" \
  -H "Authorization: Bearer $SKUFLOW_API_KEY"

Response

200: the answer's fields

An array of objects:

FieldTypeDescription
idstring
quoteIdstring
designIdstring or null
versioninteger
statusenumOne of PENDING, APPROVED, CHANGES_REQUESTED, SUPERSEDED.
designNamestring
designRevisioninteger
mockupsarray of object
mockups[].viewenumOne of FRONT, BACK, SIDE, DETAIL, OTHER.
mockups[].colorNamestring or null
mockups[].widthPxinteger
mockups[].heightPxinteger
mockups[].urlstring or nullThe flattened PNG (signed, 1 hour).
summaryanyProduct, colours and placements (method, size, artwork) as proofed.
notestring or null
decidedAtstring (date-time) or null
decidedByNamestring or null
commentsarray of object
comments[].idstring
comments[].authorenumOne of STAFF, CUSTOMER.
comments[].authorNamestring
comments[].bodystring
comments[].requestsChangesboolean
comments[].createdAtstring (date-time)
createdAtstring (date-time)

Send a new proof of a design

POST /organizations/{organizationId}/quotes/{quoteId}/proofs

Exposes to the customer: a new proof version of a design on the quote (current mockups, rendered when stale), shown on the quote page at once; earlier open versions are superseded. Sending the quote does this for designs that need it.

Permissionquotes.send (Owner, Admin, Staff)
Risksensitive, OAuth scope skuflow.sensitive. Sensitive: moves money, deletes, sends or shows something to a customer, or grants or revokes access.
MCP toolproofs_create (toolset sales)
ApprovalOver MCP, this tool asks for your OK first (in the AI app when it supports it, otherwise in SKUFlow). See Approvals.

Parameters

NameInTypeRequiredDescription
quoteIdpathstringYes

Request body

FieldTypeRequiredDescription
designIdstringYes
notestring or nullNoUp to 2000 characters.

Example

curl -X POST "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/quotes/{quoteId}/proofs" \
  -H "Authorization: Bearer $SKUFLOW_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"designId":"design_id"}'

Response

201: the answer's fields
FieldTypeDescription
idstring
versioninteger
statusstring

Reply on a proof

POST /organizations/{organizationId}/quotes/{quoteId}/proofs/{proofId}/comments

Exposes to the customer: adds a comment from the team under the proof on the quote page. Returns the quote's proofs.

Permissionquotes.send (Owner, Admin, Staff)
Risksensitive, OAuth scope skuflow.sensitive. Sensitive: moves money, deletes, sends or shows something to a customer, or grants or revokes access.
MCP toolproofs_comment (toolset sales)
ApprovalOver MCP, this tool asks for your OK first (in the AI app when it supports it, otherwise in SKUFlow). See Approvals.

Parameters

NameInTypeRequiredDescription
quoteIdpathstringYes
proofIdpathstringYes

Request body

FieldTypeRequiredDescription
bodystringYesUp to 5000 characters.

Example

curl -X POST "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/quotes/{quoteId}/proofs/{proofId}/comments" \
  -H "Authorization: Bearer $SKUFLOW_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"body":"string"}'

Response

201: the answer's fields

An array of objects:

FieldTypeDescription
idstring
quoteIdstring
designIdstring or null
versioninteger
statusenumOne of PENDING, APPROVED, CHANGES_REQUESTED, SUPERSEDED.
designNamestring
designRevisioninteger
mockupsarray of object
mockups[].viewenumOne of FRONT, BACK, SIDE, DETAIL, OTHER.
mockups[].colorNamestring or null
mockups[].widthPxinteger
mockups[].heightPxinteger
mockups[].urlstring or nullThe flattened PNG (signed, 1 hour).
summaryanyProduct, colours and placements (method, size, artwork) as proofed.
notestring or null
decidedAtstring (date-time) or null
decidedByNamestring or null
commentsarray of object
comments[].idstring
comments[].authorenumOne of STAFF, CUSTOMER.
comments[].authorNamestring
comments[].bodystring
comments[].requestsChangesboolean
comments[].createdAtstring (date-time)
createdAtstring (date-time)

On this page