DevelopersAPI reference

Invoices API

REST endpoints for invoices in SKUFlow: 8 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 invoicesGET /organizations/{organizationId}/invoicesread
Create a draft invoicePOST /organizations/{organizationId}/invoiceswrite
Get an invoice with its lines and paymentsGET /organizations/{organizationId}/invoices/{invoiceId}read
Update an invoice's status, notes or datesPATCH /organizations/{organizationId}/invoices/{invoiceId}sensitive
Delete an invoiceDELETE /organizations/{organizationId}/invoices/{invoiceId}sensitive
Update an invoice's taxPOST /organizations/{organizationId}/invoices/{invoiceId}/taxwrite
Get or create the invoice's customer linkPOST /organizations/{organizationId}/invoices/{invoiceId}/linksensitive
Replace the invoice's customer linkPOST /organizations/{organizationId}/invoices/{invoiceId}/link/regeneratesensitive

List invoices

GET /organizations/{organizationId}/invoices

Invoices newest first, filtered by text (INV-n, customer), status or customer, paged with a total. Each item carries amountPaidCents, balanceDueCents and partiallyPaid. Read-only.

Permissioninvoices.read (Owner, Admin, Staff, Member)
Riskread, OAuth scope skuflow.read. Read: reads only.
MCP toolinvoices_list (toolset invoices, 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, PAID, OVERDUE, CANCELLED.
customerIdquerystringNo
businessUnitIdquerystringNoOnly this business unit (GET /business-units), or "none" for records without one. Up to 100 characters.
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/invoices" \
  -H "Authorization: Bearer $SKUFLOW_API_KEY"

Response

200: the answer's fields
FieldTypeDescription
itemsarray of object
items[].idstringInvoice id.
items[].organizationIdstring
items[].identifierstringINV-n, unique per organization.
items[].customerIdstring
items[].statusenumDRAFT (not issued), SENT (issued, money due), PAID, OVERDUE (past dueDate) or CANCELLED. One of DRAFT, SENT, PAID, OVERDUE, CANCELLED.
items[].subtotalCentsintegerLines total before tax, in integer cents.
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[].taxCentsintegerTax, in integer cents.
items[].totalCentsintegerTotal with tax, in integer cents.
items[].propertyIdstring or nullThe ship-to address (a property of the customer); its tax rules decide the rate.
items[].notesstring or null
items[].dueDatestring or nullYYYY-MM-DD
items[].paidDatestring or nullYYYY-MM-DD
items[].amountPaidCentsintegerPaid so far, net of refunds, tips excluded, in integer cents.
items[].financingDisabledboolean
items[].importLockedbooleanImported paid history: read-only, its amounts never change.
items[].businessUnitIdstring or null
items[].customFieldsanyCustom field values by key (definitions: GET /custom-fields?entity=INVOICE).
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 nullThe ship-to address.
items[].property.idstringProperty id.
items[].property.namestring or null
items[].property.addressstring or null
items[].property.citystring or null
items[].property.countystring or null
items[].property.statestring or null
items[].property.zipstring or null
items[].property.countrystring or null
items[].balanceDueCentsintegerStill due, in integer cents.
items[].partiallyPaidboolean
totalintegerHow many match the filters, across all pages.

Create a draft invoice

POST /organizations/{organizationId}/invoices

Creates a DRAFT invoice (INV-n) for a customer with the given lines; amounts are fixed once created. Tax is 0 for tax-exempt customers, else taxRate when given, else decided for the ship-to address propertyId by the business's tax rules, else the business default. Apparel lines take the clothing rate and not-taxable pricebook items none. Nothing is sent: share it with POST /invoices/{invoiceId}/link and mark it SENT with PATCH. To bill an approved quote use POST /quotes/{quoteId}/invoice instead.

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

Request body

FieldTypeRequiredDescription
customerIdstringYesFrom GET /customers.
taxRatenumberNoPercent, e.g. 8.25, typed instead of the tax rules. Ignored for tax-exempt customers. -1000–1000.
propertyIdstring or nullNoThe ship-to address (GET /customers/{customerId} properties): its tax rules decide the rate.
notesstring or nullNoPrinted on the invoice; the customer sees it.
dueDateempty string or string or nullNoDefaults from the customer's payment terms.
linesarray of objectYesUp to 500 items.
lines[].descriptionstringYes
lines[].quantitynumberYes-1000000–1000000.
lines[].unitPriceCentsintegerYesMoney in integer cents; negative for a discount or credit line. -100000000–100000000.
lines[].pricebookItemIdstring or nullNoThe pricebook item the line was picked from (GET /pricebook/items): the server snapshots its cost; pricebook edits never change the invoice.
businessUnitIdstring or nullNoBusiness unit (GET /business-units): its branding shows on the invoice and its accounting class or tracking applies. Omitted: none (null). Up to 100 characters.
customFieldsobjectNoInvoice custom field values (GET /custom-fields?entity=INVOICE); those marked visibleToCustomer print on the invoice, its emails and pages. Required ones are checked here.

Example

curl -X POST "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/invoices" \
  -H "Authorization: Bearer $SKUFLOW_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"customerId":"customer_id","lines":[{"description":"string","quantity":1,"unitPriceCents":12500}]}'

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

Get an invoice with its lines and payments

GET /organizations/{organizationId}/invoices/{invoiceId}

Includes payments (with refunds), amountPaidCents (net of refunds, tips excluded), balanceDueCents, tipsCents, partiallyPaid and publicToken (the /i/{token} link, null until made). Read-only.

Permissioninvoices.read (Owner, Admin, Staff, Member)
Riskread, OAuth scope skuflow.read. Read: reads only.
MCP toolinvoices_get (toolset invoices, in the default set)

Parameters

NameInTypeRequiredDescription
invoiceIdpathstringYes

Example

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

Response

200: 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
customer.emailstring or null
customer.phonestring or null
customer.addressstring or null
customer.citystring or null
customer.statestring or null
customer.zipstring or null
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
linesarray of object
lines[].idstring
lines[].invoiceIdstring
lines[].descriptionstring
lines[].quantitynumber
lines[].unitPriceCentsintegerUnit price, in integer cents.
lines[].totalCentsintegerLine total, in integer cents.
lines[].sortOrderinteger
lines[].pricebookItemIdstring or null
lines[].costCentsinteger or nullOur unit cost in cents (costing.read only).
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.
lines[].groupKeystring or nullA decorated line's lines share it; send the line's product input once instead of them.
lines[].productIdstring or null
lines[].productVariantIdstring or null
lines[].designIdstring or null
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).
lines[].taxClassenumWhich rate taxes the line: STANDARD, CLOTHING (apparel), SHIPPING or EXEMPT (set by the server). One of STANDARD, CLOTHING, SHIPPING, EXEMPT.
quotesarray of objectQuotes invoiced here (Q-n).
quotes[].idstring
quotes[].identifierstringQ-n
quotes[].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.
paymentsarray of objectPayments on the invoice, with their refunds.
payments[].idstring
payments[].identifierstringPAY-n
payments[].amountCentsinteger
payments[].tipCentsinteger
payments[].refundedCentsinteger
payments[].methodenumOne of CASH, CHECK, CARD, BANK_TRANSFER, OTHER.
payments[].paidOnstringYYYY-MM-DD
payments[].statusenumOne of SUCCEEDED, PENDING, FAILED, REFUNDED, PARTIALLY_REFUNDED.
tipsCentsintegerTips collected, net of refunds, in integer cents.
publicTokenstring or nullThe customer link token (/i/{token}); null until one is made.

Update an invoice's status, notes or dates

PATCH /organizations/{organizationId}/invoices/{invoiceId}

Amounts are fixed once created. MONEY: setting status: PAID while a balance is due records that balance as a payment (method OTHER, dated paidDate or today) so payments and status agree; prefer POST /invoices/{invoiceId}/payments to record the real method. An invoice paid in full cannot be set back to DRAFT/SENT/OVERDUE (refund a payment instead, 409), and one holding payments cannot be CANCELLED (409). paidDate is only for paid invoices. Marking SENT does not email anything.

Permissioninvoices.write (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 toolinvoices_update (toolset invoices, 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
invoiceIdpathstringYes

Request body

FieldTypeRequiredDescription
statusenumNoOne of DRAFT, SENT, PAID, OVERDUE, CANCELLED.
notesstring or nullNo
dueDateempty string or string or nullNo
paidDateempty string or string or nullNo
businessUnitIdstring or nullNoMove the invoice to another business unit (GET /business-units), or null for none. Up to 100 characters.
propertyIdstring or nullNoThe ship-to address (one of the customer's properties), or null. A draft without payments is taxed again for it.
financingDisabledbooleanNoExposes to customers: true hides Affirm and Klarna on this invoice's pay page even when the business offers financing.
todaystringNoThe business's today (YYYY-MM-DD), for the paid date and reopened-overdue checks.
customFieldsobjectNoCustom field values by key (definitions: GET /custom-fields?entity=INVOICE); merged into the saved values on an update, null clears one. Checked against each field's type and options; unknown keys are refused.

Example

curl -X PATCH "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/invoices/{invoiceId}" \
  -H "Authorization: Bearer $SKUFLOW_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"status":"DRAFT","notes":"string","dueDate":"2026-11-03"}'

Response

200: 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

Delete an invoice

DELETE /organizations/{organizationId}/invoices/{invoiceId}

Destructive: deletes the invoice and its lines. Refused (409) while the invoice holds any payment; cancel it instead.

Permissioninvoices.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 toolinvoices_delete (toolset invoices)
ApprovalOver MCP, this tool always waits for your approval in SKUFlow. See Approvals.

Parameters

NameInTypeRequiredDescription
invoiceIdpathstringYes

Example

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

Response

200: the answer's fields
FieldTypeDescription
oktrue

Update an invoice's tax

POST /organizations/{organizationId}/invoices/{invoiceId}/tax

Taxes a DRAFT invoice without payments again: for its ship-to address under the business's current tax rules, or at taxRate when given. Changes its tax and total; 409 once it is issued, paid or imported (amounts are fixed). Answers the invoice with taxDetails (how the rate was decided).

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

Parameters

NameInTypeRequiredDescription
invoiceIdpathstringYes

Request body

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

Example

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

Response

200: 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
customer.emailstring or null
customer.phonestring or null
customer.addressstring or null
customer.citystring or null
customer.statestring or null
customer.zipstring or null
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
linesarray of object
lines[].idstring
lines[].invoiceIdstring
lines[].descriptionstring
lines[].quantitynumber
lines[].unitPriceCentsintegerUnit price, in integer cents.
lines[].totalCentsintegerLine total, in integer cents.
lines[].sortOrderinteger
lines[].pricebookItemIdstring or null
lines[].costCentsinteger or nullOur unit cost in cents (costing.read only).
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.
lines[].groupKeystring or nullA decorated line's lines share it; send the line's product input once instead of them.
lines[].productIdstring or null
lines[].productVariantIdstring or null
lines[].designIdstring or null
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).
lines[].taxClassenumWhich rate taxes the line: STANDARD, CLOTHING (apparel), SHIPPING or EXEMPT (set by the server). One of STANDARD, CLOTHING, SHIPPING, EXEMPT.
quotesarray of objectQuotes invoiced here (Q-n).
quotes[].idstring
quotes[].identifierstringQ-n
quotes[].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.
paymentsarray of objectPayments on the invoice, with their refunds.
payments[].idstring
payments[].identifierstringPAY-n
payments[].amountCentsinteger
payments[].tipCentsinteger
payments[].refundedCentsinteger
payments[].methodenumOne of CASH, CHECK, CARD, BANK_TRANSFER, OTHER.
payments[].paidOnstringYYYY-MM-DD
payments[].statusenumOne of SUCCEEDED, PENDING, FAILED, REFUNDED, PARTIALLY_REFUNDED.
tipsCentsintegerTips collected, net of refunds, in integer cents.
publicTokenstring or nullThe customer link token (/i/{token}); null until one is made.
POST /organizations/{organizationId}/invoices/{invoiceId}/link

Exposes to the customer: returns the token for /i/{token}, the customer's page for this one invoice (no sign-in; anyone with the link can read it). Made on first call and then reused, so calling it again is safe. Drafts and cancelled invoices are not shown on that page until issued. Nothing is emailed.

Permissioninvoices.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 toolinvoiceLinks_ensure (toolset invoices)
ApprovalOver MCP, this tool asks for your OK first (in the AI app when it supports it, otherwise in SKUFlow). See Approvals.

Parameters

NameInTypeRequiredDescription
invoiceIdpathstringYes

Example

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

Response

200: the answer's fields
FieldTypeDescription
tokenstringOpen the invoice at /i/{token} on the web app.
createdAtstring (date-time)
POST /organizations/{organizationId}/invoices/{invoiceId}/link/regenerate

Destructive: issues a new token; the previous /i/{token} link stops working at once.

Permissioninvoices.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 toolinvoiceLinks_regenerate (toolset invoices)
ApprovalOver MCP, this tool asks for your OK first (in the AI app when it supports it, otherwise in SKUFlow). See Approvals.

Parameters

NameInTypeRequiredDescription
invoiceIdpathstringYes

Example

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

Response

200: the answer's fields
FieldTypeDescription
tokenstringOpen the invoice at /i/{token} on the web app.
createdAtstring (date-time)

On this page