Pricebook API
REST endpoints for pricebook in SKUFlow: 20 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.
| Operation | Endpoint | Risk |
|---|---|---|
| List pricebook categories | GET /organizations/{organizationId}/pricebook/categories | read |
| Create a pricebook category | POST /organizations/{organizationId}/pricebook/categories | write |
| Update a pricebook category | PATCH /organizations/{organizationId}/pricebook/categories/{categoryId} | write |
| Delete a pricebook category | DELETE /organizations/{organizationId}/pricebook/categories/{categoryId} | sensitive |
| Start a category image upload | POST /organizations/{organizationId}/pricebook/categories/{categoryId}/image | write |
| Remove a category's image | DELETE /organizations/{organizationId}/pricebook/categories/{categoryId}/image | sensitive |
| Confirm a category image upload | POST /organizations/{organizationId}/pricebook/categories/{categoryId}/image/{attachmentId}/confirm | write |
| Set a pricebook category's picture (content in the request) | POST /organizations/{organizationId}/pricebook/categories/{categoryId}/image/content | write |
| List pricebook items | GET /organizations/{organizationId}/pricebook/items | read |
| Create a pricebook item | POST /organizations/{organizationId}/pricebook/items | write |
| Get a pricebook item with its stock | GET /organizations/{organizationId}/pricebook/items/{itemId} | read |
| Update a pricebook item | PATCH /organizations/{organizationId}/pricebook/items/{itemId} | write |
| Delete a pricebook item | DELETE /organizations/{organizationId}/pricebook/items/{itemId} | sensitive |
| Duplicate a pricebook item | POST /organizations/{organizationId}/pricebook/items/{itemId}/duplicate | write |
| Start an item image upload | POST /organizations/{organizationId}/pricebook/items/{itemId}/image | write |
| Remove an item's image | DELETE /organizations/{organizationId}/pricebook/items/{itemId}/image | sensitive |
| Confirm an item image upload | POST /organizations/{organizationId}/pricebook/items/{itemId}/image/{attachmentId}/confirm | write |
| Export the pricebook as CSV | GET /organizations/{organizationId}/pricebook/export | read |
| Import pricebook items from CSV (with a dry run) | POST /organizations/{organizationId}/pricebook/import | write |
| Set a pricebook item's picture (content in the request) | POST /organizations/{organizationId}/pricebook/items/{itemId}/image/content | write |
List pricebook categories
GET /organizations/{organizationId}/pricebook/categories
Every category (a tree through parentId), with its path, item count and image. Read-only. Build the tree client-side from parentId and sortOrder.
| Permission | pricebook.read (Owner, Admin, Staff, Member) |
| Risk | read, OAuth scope skuflow.read. Read: reads only. |
| MCP tool | pricebookCategories_list (toolset pricebook) |
Example
curl "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/pricebook/categories" \
-H "Authorization: Bearer $SKUFLOW_API_KEY"Response
200: the answer's fields
An array of objects:
| Field | Type | Description |
|---|---|---|
id | string | |
organizationId | string | |
name | string | |
parentId | string or null | |
sortOrder | integer | |
active | boolean | |
createdAt | string (date-time) | |
updatedAt | string (date-time) | |
itemCount | integer | |
path | string | The path from the root, e.g. "Apparel › T-shirts". |
imageUrl | string or null | A 10-minute signed URL of the category's image. |
Create a pricebook category
POST /organizations/{organizationId}/pricebook/categories
Adds a category, at the top level or under parentId. Returns it. Images: POST /pricebook/categories/{categoryId}/image.
| Permission | pricebook.manage (Owner, Admin) |
| Risk | write, OAuth scope skuflow.write. Write: creates or changes records inside the business; nothing leaves it. |
| MCP tool | pricebookCategories_create (toolset pricebook) |
Request body
| Field | Type | Required | Description |
|---|---|---|---|
name | string | Yes | Up to 200 characters. |
parentId | string or null | No | The parent category (a tree); null for a top-level category. |
sortOrder | integer | No | 0–100000. |
active | boolean | No |
Example
curl -X POST "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/pricebook/categories" \
-H "Authorization: Bearer $SKUFLOW_API_KEY" \
-H "Content-Type: application/json" \
-d '{"name":"Dana Whitfield"}'Response
201: the answer's fields
| Field | Type | Description |
|---|---|---|
id | string | |
organizationId | string | |
name | string | |
parentId | string or null | |
sortOrder | integer | |
active | boolean | |
createdAt | string (date-time) | |
updatedAt | string (date-time) |
Update a pricebook category
PATCH /organizations/{organizationId}/pricebook/categories/{categoryId}
Renames, moves (parentId; a category cannot move inside itself, 400), reorders or retires a category. Returns it.
| Permission | pricebook.manage (Owner, Admin) |
| Risk | write, OAuth scope skuflow.write. Write: creates or changes records inside the business; nothing leaves it. |
| MCP tool | pricebookCategories_update (toolset pricebook) |
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
categoryId | path | string | Yes |
Request body
| Field | Type | Required | Description |
|---|---|---|---|
name | string | No | Up to 200 characters. |
parentId | string or null | No | The parent category (a tree); null for a top-level category. |
sortOrder | integer | No | 0–100000. |
active | boolean | No |
Example
curl -X PATCH "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/pricebook/categories/{categoryId}" \
-H "Authorization: Bearer $SKUFLOW_API_KEY" \
-H "Content-Type: application/json" \
-d '{"name":"Dana Whitfield","parentId":"parent_id","sortOrder":1}'Response
200: the answer's fields
| Field | Type | Description |
|---|---|---|
id | string | |
organizationId | string | |
name | string | |
parentId | string or null | |
sortOrder | integer | |
active | boolean | |
createdAt | string (date-time) | |
updatedAt | string (date-time) |
Delete a pricebook category
DELETE /organizations/{organizationId}/pricebook/categories/{categoryId}
Destructive: deletes the category and its image; its items and sub-categories move up to its parent. No item is deleted.
| Permission | pricebook.manage (Owner, Admin) |
| Risk | sensitive, OAuth scope skuflow.sensitive. Sensitive: moves money, deletes, sends or shows something to a customer, or grants or revokes access. |
| MCP tool | pricebookCategories_delete (toolset pricebook) |
| Approval | Over MCP, this tool always waits for your approval in SKUFlow. See Approvals. |
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
categoryId | path | string | Yes |
Example
curl -X DELETE "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/pricebook/categories/{categoryId}" \
-H "Authorization: Bearer $SKUFLOW_API_KEY"Response
200: the answer's fields
| Field | Type | Description |
|---|---|---|
ok | true |
Start a category image upload
POST /organizations/{organizationId}/pricebook/categories/{categoryId}/image
Step 1 of 2: returns uploadUrl; PUT the image there within 5 minutes, then POST …/image/{attachmentId}/confirm. Images only.
| Permission | pricebook.manage (Owner, Admin) |
| Risk | write, OAuth scope skuflow.write. Write: creates or changes records inside the business; nothing leaves it. |
| MCP tool | pricebookCategories_uploadImage (toolset pricebook) |
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
categoryId | path | string | Yes |
Request body
| Field | Type | Required | Description |
|---|---|---|---|
fileName | string | Yes | Up to 500 characters. |
contentType | string | Yes | An image/* type, e.g. image/jpeg. Up to 200 characters. |
sizeBytes | integer | Yes | Up to 25 MB. |
Example
curl -X POST "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/pricebook/categories/{categoryId}/image" \
-H "Authorization: Bearer $SKUFLOW_API_KEY" \
-H "Content-Type: application/json" \
-d '{"fileName":"string","contentType":"string","sizeBytes":1}'Response
201: the answer's fields
| Field | Type | Description |
|---|---|---|
attachment | object | |
attachment.id | string | |
attachment.fileName | string | |
attachment.contentType | string | |
attachment.sizeBytes | integer | |
attachment.uploadedAt | string (date-time) or null | |
attachment.createdAt | string (date-time) | |
uploadUrl | string | PUT the bytes here (same Content-Type) within 5 minutes. |
Remove a category's image
DELETE /organizations/{organizationId}/pricebook/categories/{categoryId}/image
Destructive: deletes the category's image file.
| Permission | pricebook.manage (Owner, Admin) |
| Risk | sensitive, OAuth scope skuflow.sensitive. Sensitive: moves money, deletes, sends or shows something to a customer, or grants or revokes access. |
| MCP tool | pricebookCategories_deleteImage (toolset pricebook) |
| Approval | Over MCP, this tool always waits for your approval in SKUFlow. See Approvals. |
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
categoryId | path | string | Yes |
Example
curl -X DELETE "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/pricebook/categories/{categoryId}/image" \
-H "Authorization: Bearer $SKUFLOW_API_KEY"Response
200: the answer's fields
| Field | Type | Description |
|---|---|---|
ok | true |
Confirm a category image upload
POST
/organizations/{organizationId}/pricebook/categories/{categoryId}/image/{attachmentId}/confirm
Step 2 of 2: the uploaded image becomes the category's image (replacing the previous one). Returns it with a 10-minute URL.
| Permission | pricebook.manage (Owner, Admin) |
| Risk | write, OAuth scope skuflow.write. Write: creates or changes records inside the business; nothing leaves it. |
| MCP tool | pricebookCategories_confirmImage (toolset pricebook) |
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
categoryId | path | string | Yes | |
attachmentId | path | string | Yes |
Example
curl -X POST "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/pricebook/categories/{categoryId}/image/{attachmentId}/confirm" \
-H "Authorization: Bearer $SKUFLOW_API_KEY"Response
200: the answer's fields
| Field | Type | Description |
|---|---|---|
id | string | |
fileName | string | |
contentType | string | |
sizeBytes | integer | |
uploadedAt | string (date-time) or null | |
createdAt | string (date-time) | |
url | string |
Set a pricebook category's picture (content in the request)
POST /organizations/{organizationId}/pricebook/categories/{categoryId}/image/content
Sets the picture of a pricebook category in one call, replacing the old one: send contentBase64 or a public sourceUrl (an image, up to 10 MB). Shown on quotes and in the pricebook. Returns the image with a 10-minute URL.
| Permission | pricebook.manage (Owner, Admin) |
| Risk | write, OAuth scope skuflow.write. Write: creates or changes records inside the business; nothing leaves it. |
| MCP tool | pricebookCategories_setImage (toolset pricebook) |
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
categoryId | path | string | Yes |
Request body
| Field | Type | Required | Description |
|---|---|---|---|
fileName | string | No | The file's name, e.g. receipt.jpg (default: from the URL, else 'file'). Up to 500 characters. |
contentType | string | No | MIME type, e.g. image/jpeg or application/pdf. Optional: taken from a data: URL, the URL's answer or the file's first bytes. Up to 200 characters. |
contentBase64 | string | No | The file's bytes as base64 (a data: URL is accepted too). Up to 10 MB. Give this or sourceUrl. |
sourceUrl | string (uri) | No | A public http(s) URL SKUFlow downloads the file from (up to 10 MB, 20 s, 3 redirects; private and internal addresses are refused). Give this or contentBase64. Up to 2000 characters. |
Example
curl -X POST "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/pricebook/categories/{categoryId}/image/content" \
-H "Authorization: Bearer $SKUFLOW_API_KEY" \
-H "Content-Type: application/json" \
-d '{"fileName":"string","contentType":"string","contentBase64":"string"}'Response
201: the answer's fields
| Field | Type | Description |
|---|---|---|
id | string | The attachment id. |
fileName | string | |
contentType | string | |
sizeBytes | integer | |
uploadedAt | string (date-time) or null | |
createdAt | string (date-time) | |
url | string | View URL, valid for 10 minutes. |
List pricebook items
GET /organizations/{organizationId}/pricebook/items
Items with price, stock on hand and image (and, with costing.read, cost and margin), filtered by text (name, code, description, vendor part number), category (sub-categories included), kind or vendor; active only unless includeInactive. Paged with a total. Read-only.
| Permission | pricebook.read (Owner, Admin, Staff, Member) |
| Risk | read, OAuth scope skuflow.read. Read: reads only. |
| MCP tool | pricebookItems_list (toolset pricebook, in the default set) |
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
query | query | string | No | Free-text search over the list's names, numbers and contact details. Up to 200 characters. |
categoryId | query | string | No | |
kind | query | enum | No | SERVICE (decoration, setup, artwork, labour), MATERIAL (blank goods and supplies, kept in stock) or FEE (rush, shipping, screen or digitizing charges). One of SERVICE, MATERIAL, FEE. |
vendorId | query | string | No | |
includeInactive | query | boolean or enum | No | |
limit | query | integer | No | Page size, 1–200. Default 50. |
offset | query | integer | No | Rows to skip; the answer's total counts every match. Default 0. |
Example
curl "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/pricebook/items" \
-H "Authorization: Bearer $SKUFLOW_API_KEY"Response
200: the answer's fields
| Field | Type | Description |
|---|---|---|
items | array of object | |
items[].id | string | |
items[].organizationId | string | |
items[].kind | enum | SERVICE (decoration, setup, artwork, labour), MATERIAL (blank goods and supplies, kept in stock) or FEE (rush, shipping, screen or digitizing charges). One of SERVICE, MATERIAL, FEE. |
items[].code | string or null | |
items[].name | string | |
items[].description | string or null | |
items[].internalNotes | string or null | |
items[].categoryId | string or null | |
items[].unit | string | |
items[].costCents | integer | Our unit cost. Present only for roles with costing.read. |
items[].priceCents | integer | Integer cents. |
items[].taxable | boolean | |
items[].vendorId | string or null | |
items[].vendorPartNumber | string or null | |
items[].active | boolean | |
items[].createdAt | string (date-time) | |
items[].updatedAt | string (date-time) | |
items[].category | object or null | |
items[].category.id | string | |
items[].category.name | string | |
items[].category.parentId | string or null | |
items[].vendor | object or null | |
items[].vendor.id | string | |
items[].vendor.name | string | |
items[].imageUrl | string or null | A 10-minute signed URL of the item's image. |
items[].marginCents | integer | Price − cost. Present only for roles with costing.read. |
items[].marginPercent | number or null | Margin as a percent of the price. Present only for roles with costing.read. |
items[].onHand | number | Stock on hand across every location (stocked kinds). |
items[].lowStock | boolean | At or below a reorder point somewhere. |
total | integer |
Create a pricebook item
POST /organizations/{organizationId}/pricebook/items
Adds an item. A duplicate code is 409. Documents already written are never changed by pricebook edits (their lines keep snapshots). Returns the item.
| Permission | pricebook.manage (Owner, Admin) |
| Risk | write, OAuth scope skuflow.write. Write: creates or changes records inside the business; nothing leaves it. |
| MCP tool | pricebookItems_create (toolset pricebook) |
Request body
| Field | Type | Required | Description |
|---|---|---|---|
kind | enum | Yes | SERVICE (decoration, setup, artwork, labour), MATERIAL (blank goods and supplies, kept in stock) or FEE (rush, shipping, screen or digitizing charges). One of SERVICE, MATERIAL, FEE. |
code | string or null | No | Code / SKU, unique in the organization when set. Up to 100 characters. |
name | string | Yes | Up to 500 characters. |
description | string or null | No | Customer-facing: printed on quotes and invoices. |
internalNotes | string or null | No | Staff only. |
categoryId | string or null | No | From GET /pricebook/categories. |
unit | string | No | ea, hr, ft…; blank means "ea". Up to 50 characters. |
costCents | integer | No | Our unit cost in cents (purchase receipts update it by moving average). 0–100000000. |
priceCents | integer | No | The unit price in cents. 0–100000000. |
taxable | boolean | No | |
vendorId | string or null | No | From GET /vendors. |
vendorPartNumber | string or null | No | Up to 200 characters. |
active | boolean | No | Retired items (false) leave the pickers. |
Example
curl -X POST "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/pricebook/items" \
-H "Authorization: Bearer $SKUFLOW_API_KEY" \
-H "Content-Type: application/json" \
-d '{"kind":"SERVICE","name":"Dana Whitfield"}'Response
201: the answer's fields
| Field | Type | Description |
|---|---|---|
id | string | |
organizationId | string | |
kind | enum | SERVICE (decoration, setup, artwork, labour), MATERIAL (blank goods and supplies, kept in stock) or FEE (rush, shipping, screen or digitizing charges). One of SERVICE, MATERIAL, FEE. |
code | string or null | |
name | string | |
description | string or null | |
internalNotes | string or null | |
categoryId | string or null | |
unit | string | |
costCents | integer | Our unit cost. Present only for roles with costing.read. |
priceCents | integer | Integer cents. |
taxable | boolean | |
vendorId | string or null | |
vendorPartNumber | string or null | |
active | boolean | |
createdAt | string (date-time) | |
updatedAt | string (date-time) | |
category | object or null | |
category.id | string | |
category.name | string | |
category.parentId | string or null | |
vendor | object or null | |
vendor.id | string | |
vendor.name | string | |
imageUrl | string or null | A 10-minute signed URL of the item's image. |
marginCents | integer | Price − cost. Present only for roles with costing.read. |
marginPercent | number or null | Margin as a percent of the price. Present only for roles with costing.read. |
onHand | number | Stock on hand across every location (stocked kinds). |
lowStock | boolean | At or below a reorder point somewhere. |
Get a pricebook item with its stock
GET /organizations/{organizationId}/pricebook/items/{itemId}
One item with its stock at each location (on hand, reorder point and quantity). Read-only.
| Permission | pricebook.read (Owner, Admin, Staff, Member) |
| Risk | read, OAuth scope skuflow.read. Read: reads only. |
| MCP tool | pricebookItems_get (toolset pricebook) |
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
itemId | path | string | Yes |
Example
curl "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/pricebook/items/{itemId}" \
-H "Authorization: Bearer $SKUFLOW_API_KEY"Response
200: the answer's fields
| Field | Type | Description |
|---|---|---|
id | string | |
organizationId | string | |
kind | enum | SERVICE (decoration, setup, artwork, labour), MATERIAL (blank goods and supplies, kept in stock) or FEE (rush, shipping, screen or digitizing charges). One of SERVICE, MATERIAL, FEE. |
code | string or null | |
name | string | |
description | string or null | |
internalNotes | string or null | |
categoryId | string or null | |
unit | string | |
costCents | integer | Our unit cost. Present only for roles with costing.read. |
priceCents | integer | Integer cents. |
taxable | boolean | |
vendorId | string or null | |
vendorPartNumber | string or null | |
active | boolean | |
createdAt | string (date-time) | |
updatedAt | string (date-time) | |
category | object or null | |
category.id | string | |
category.name | string | |
category.parentId | string or null | |
vendor | object or null | |
vendor.id | string | |
vendor.name | string | |
imageUrl | string or null | A 10-minute signed URL of the item's image. |
marginCents | integer | Price − cost. Present only for roles with costing.read. |
marginPercent | number or null | Margin as a percent of the price. Present only for roles with costing.read. |
onHand | number | Stock on hand across every location (stocked kinds). |
lowStock | boolean | At or below a reorder point somewhere. |
stock | array of object | |
stock[].locationId | string | |
stock[].location | object | |
stock[].location.id | string | |
stock[].location.name | string | |
stock[].onHand | number | |
stock[].reorderPoint | number or null | |
stock[].reorderQty | number or null | |
stock[].low | boolean |
Update a pricebook item
PATCH /organizations/{organizationId}/pricebook/items/{itemId}
Changes the fields sent. Quotes and invoices already written keep their own prices and costs. Returns the item.
| Permission | pricebook.manage (Owner, Admin) |
| Risk | write, OAuth scope skuflow.write. Write: creates or changes records inside the business; nothing leaves it. |
| MCP tool | pricebookItems_update (toolset pricebook) |
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
itemId | path | string | Yes |
Request body
| Field | Type | Required | Description |
|---|---|---|---|
kind | enum | No | SERVICE (decoration, setup, artwork, labour), MATERIAL (blank goods and supplies, kept in stock) or FEE (rush, shipping, screen or digitizing charges). One of SERVICE, MATERIAL, FEE. |
code | string or null | No | Code / SKU, unique in the organization when set. Up to 100 characters. |
name | string | No | Up to 500 characters. |
description | string or null | No | Customer-facing: printed on quotes and invoices. |
internalNotes | string or null | No | Staff only. |
categoryId | string or null | No | From GET /pricebook/categories. |
unit | string | No | ea, hr, ft…; blank means "ea". Up to 50 characters. |
costCents | integer | No | Our unit cost in cents (purchase receipts update it by moving average). 0–100000000. |
priceCents | integer | No | The unit price in cents. 0–100000000. |
taxable | boolean | No | |
vendorId | string or null | No | From GET /vendors. |
vendorPartNumber | string or null | No | Up to 200 characters. |
active | boolean | No | Retired items (false) leave the pickers. |
Example
curl -X PATCH "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/pricebook/items/{itemId}" \
-H "Authorization: Bearer $SKUFLOW_API_KEY" \
-H "Content-Type: application/json" \
-d '{"kind":"SERVICE","code":"string","name":"Dana Whitfield"}'Response
200: the answer's fields
| Field | Type | Description |
|---|---|---|
id | string | |
organizationId | string | |
kind | enum | SERVICE (decoration, setup, artwork, labour), MATERIAL (blank goods and supplies, kept in stock) or FEE (rush, shipping, screen or digitizing charges). One of SERVICE, MATERIAL, FEE. |
code | string or null | |
name | string | |
description | string or null | |
internalNotes | string or null | |
categoryId | string or null | |
unit | string | |
costCents | integer | Our unit cost. Present only for roles with costing.read. |
priceCents | integer | Integer cents. |
taxable | boolean | |
vendorId | string or null | |
vendorPartNumber | string or null | |
active | boolean | |
createdAt | string (date-time) | |
updatedAt | string (date-time) | |
category | object or null | |
category.id | string | |
category.name | string | |
category.parentId | string or null | |
vendor | object or null | |
vendor.id | string | |
vendor.name | string | |
imageUrl | string or null | A 10-minute signed URL of the item's image. |
marginCents | integer | Price − cost. Present only for roles with costing.read. |
marginPercent | number or null | Margin as a percent of the price. Present only for roles with costing.read. |
onHand | number | Stock on hand across every location (stocked kinds). |
lowStock | boolean | At or below a reorder point somewhere. |
Delete a pricebook item
DELETE /organizations/{organizationId}/pricebook/items/{itemId}
Destructive: deletes an item that was never stocked or ordered (409 otherwise: retire it with active: false). Quote and invoice lines that used it keep their text and prices.
| Permission | pricebook.manage (Owner, Admin) |
| Risk | sensitive, OAuth scope skuflow.sensitive. Sensitive: moves money, deletes, sends or shows something to a customer, or grants or revokes access. |
| MCP tool | pricebookItems_delete (toolset pricebook) |
| Approval | Over MCP, this tool always waits for your approval in SKUFlow. See Approvals. |
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
itemId | path | string | Yes |
Example
curl -X DELETE "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/pricebook/items/{itemId}" \
-H "Authorization: Bearer $SKUFLOW_API_KEY"Response
200: the answer's fields
| Field | Type | Description |
|---|---|---|
ok | true |
Duplicate a pricebook item
POST /organizations/{organizationId}/pricebook/items/{itemId}/duplicate
Copies an item as "<name> (copy)" with the same category, price, cost, unit, vendor and notes; no code, no stock, no image. Returns the new item; rename it with update.
| Permission | pricebook.manage (Owner, Admin) |
| Risk | write, OAuth scope skuflow.write. Write: creates or changes records inside the business; nothing leaves it. |
| MCP tool | pricebookItems_duplicate (toolset pricebook) |
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
itemId | path | string | Yes |
Example
curl -X POST "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/pricebook/items/{itemId}/duplicate" \
-H "Authorization: Bearer $SKUFLOW_API_KEY"Response
201: the answer's fields
| Field | Type | Description |
|---|---|---|
id | string | |
organizationId | string | |
kind | enum | SERVICE (decoration, setup, artwork, labour), MATERIAL (blank goods and supplies, kept in stock) or FEE (rush, shipping, screen or digitizing charges). One of SERVICE, MATERIAL, FEE. |
code | string or null | |
name | string | |
description | string or null | |
internalNotes | string or null | |
categoryId | string or null | |
unit | string | |
costCents | integer | Our unit cost. Present only for roles with costing.read. |
priceCents | integer | Integer cents. |
taxable | boolean | |
vendorId | string or null | |
vendorPartNumber | string or null | |
active | boolean | |
createdAt | string (date-time) | |
updatedAt | string (date-time) | |
category | object or null | |
category.id | string | |
category.name | string | |
category.parentId | string or null | |
vendor | object or null | |
vendor.id | string | |
vendor.name | string | |
imageUrl | string or null | A 10-minute signed URL of the item's image. |
marginCents | integer | Price − cost. Present only for roles with costing.read. |
marginPercent | number or null | Margin as a percent of the price. Present only for roles with costing.read. |
onHand | number | Stock on hand across every location (stocked kinds). |
lowStock | boolean | At or below a reorder point somewhere. |
Start an item image upload
POST /organizations/{organizationId}/pricebook/items/{itemId}/image
Step 1 of 2: returns uploadUrl; PUT the image there within 5 minutes, then POST …/image/{attachmentId}/confirm. Images only, up to 25 MB.
| Permission | pricebook.manage (Owner, Admin) |
| Risk | write, OAuth scope skuflow.write. Write: creates or changes records inside the business; nothing leaves it. |
| MCP tool | pricebookItems_uploadImage (toolset pricebook) |
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
itemId | path | string | Yes |
Request body
| Field | Type | Required | Description |
|---|---|---|---|
fileName | string | Yes | Up to 500 characters. |
contentType | string | Yes | An image/* type, e.g. image/jpeg. Up to 200 characters. |
sizeBytes | integer | Yes | Up to 25 MB. |
Example
curl -X POST "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/pricebook/items/{itemId}/image" \
-H "Authorization: Bearer $SKUFLOW_API_KEY" \
-H "Content-Type: application/json" \
-d '{"fileName":"string","contentType":"string","sizeBytes":1}'Response
201: the answer's fields
| Field | Type | Description |
|---|---|---|
attachment | object | |
attachment.id | string | |
attachment.fileName | string | |
attachment.contentType | string | |
attachment.sizeBytes | integer | |
attachment.uploadedAt | string (date-time) or null | |
attachment.createdAt | string (date-time) | |
uploadUrl | string | PUT the bytes here (same Content-Type) within 5 minutes. |
Remove an item's image
DELETE /organizations/{organizationId}/pricebook/items/{itemId}/image
Destructive: deletes the item's image file.
| Permission | pricebook.manage (Owner, Admin) |
| Risk | sensitive, OAuth scope skuflow.sensitive. Sensitive: moves money, deletes, sends or shows something to a customer, or grants or revokes access. |
| MCP tool | pricebookItems_deleteImage (toolset pricebook) |
| Approval | Over MCP, this tool always waits for your approval in SKUFlow. See Approvals. |
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
itemId | path | string | Yes |
Example
curl -X DELETE "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/pricebook/items/{itemId}/image" \
-H "Authorization: Bearer $SKUFLOW_API_KEY"Response
200: the answer's fields
| Field | Type | Description |
|---|---|---|
ok | true |
Confirm an item image upload
POST /organizations/{organizationId}/pricebook/items/{itemId}/image/{attachmentId}/confirm
Step 2 of 2: the uploaded image becomes the item's image (replacing the previous one), shown in the pricebook browser. Returns it with a 10-minute URL.
| Permission | pricebook.manage (Owner, Admin) |
| Risk | write, OAuth scope skuflow.write. Write: creates or changes records inside the business; nothing leaves it. |
| MCP tool | pricebookItems_confirmImage (toolset pricebook) |
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
itemId | path | string | Yes | |
attachmentId | path | string | Yes |
Example
curl -X POST "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/pricebook/items/{itemId}/image/{attachmentId}/confirm" \
-H "Authorization: Bearer $SKUFLOW_API_KEY"Response
200: the answer's fields
| Field | Type | Description |
|---|---|---|
id | string | |
fileName | string | |
contentType | string | |
sizeBytes | integer | |
uploadedAt | string (date-time) or null | |
createdAt | string (date-time) | |
url | string |
Export the pricebook as CSV
GET /organizations/{organizationId}/pricebook/export
Every item (active or not) as CSV: code, name, kind, category path, unit, cost, price, taxable, vendor, vendor part number, description, internal notes, active. Money in dollars (12.50). The same format POST /pricebook/import reads. Includes costs, so it needs pricebook.manage (owners and admins). Read-only.
| Permission | pricebook.manage (Owner, Admin) |
| Risk | read, OAuth scope skuflow.read. Read: reads only. |
| MCP tool | pricebookItems_export (toolset pricebook) |
Example
curl "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/pricebook/export" \
-H "Authorization: Bearer $SKUFLOW_API_KEY"Response
200: the answer's fields
| Field | Type | Description |
|---|---|---|
fileName | string | |
csv | string | |
count | integer |
Import pricebook items from CSV (with a dry run)
POST /organizations/{organizationId}/pricebook/import
Reads the export's CSV format (only name is required). Rows whose code matches an item update it; others create items. Missing categories (by path, e.g. Apparel › T-shirts) are created; vendors must exist (by name). dryRun: true (do this first) writes nothing and returns what would be created or updated and every problem with its line and column. Applying writes the valid rows in one transaction and reports the skipped ones.
| Permission | pricebook.manage (Owner, Admin) |
| Risk | write, OAuth scope skuflow.write. Write: creates or changes records inside the business; nothing leaves it. |
| MCP tool | pricebookItems_import (toolset pricebook) |
Request body
| Field | Type | Required | Description |
|---|---|---|---|
csv | string | Yes | The file's text (UTF-8). |
dryRun | boolean | No | true: only check and report. Default true. |
Example
curl -X POST "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/pricebook/import" \
-H "Authorization: Bearer $SKUFLOW_API_KEY" \
-H "Content-Type: application/json" \
-d '{"csv":"string"}'Response
200: the answer's fields
| Field | Type | Description |
|---|---|---|
dryRun | boolean | |
rows | array of object | |
rows[].line | integer | |
rows[].action | enum | One of create, update. |
rows[].code | string or null | |
rows[].name | string | |
created | integer | |
updated | integer | |
categoriesCreated | array of string | |
skipped | integer | |
problems | array of object | |
problems[].line | integer | 1-based line in the file; the header is line 1. |
problems[].column | string or null | |
problems[].message | string | |
problems[].severity | enum | Errors skip the row; warnings are only reported. One of error, warning. |
Set a pricebook item's picture (content in the request)
POST /organizations/{organizationId}/pricebook/items/{itemId}/image/content
Sets the picture of a pricebook item in one call, replacing the old one: send contentBase64 or a public sourceUrl (an image, up to 10 MB). Shown on quotes and in the pricebook. Returns the image with a 10-minute URL.
| Permission | pricebook.manage (Owner, Admin) |
| Risk | write, OAuth scope skuflow.write. Write: creates or changes records inside the business; nothing leaves it. |
| MCP tool | pricebookItems_setImage (toolset pricebook) |
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
itemId | path | string | Yes |
Request body
| Field | Type | Required | Description |
|---|---|---|---|
fileName | string | No | The file's name, e.g. receipt.jpg (default: from the URL, else 'file'). Up to 500 characters. |
contentType | string | No | MIME type, e.g. image/jpeg or application/pdf. Optional: taken from a data: URL, the URL's answer or the file's first bytes. Up to 200 characters. |
contentBase64 | string | No | The file's bytes as base64 (a data: URL is accepted too). Up to 10 MB. Give this or sourceUrl. |
sourceUrl | string (uri) | No | A public http(s) URL SKUFlow downloads the file from (up to 10 MB, 20 s, 3 redirects; private and internal addresses are refused). Give this or contentBase64. Up to 2000 characters. |
Example
curl -X POST "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/pricebook/items/{itemId}/image/content" \
-H "Authorization: Bearer $SKUFLOW_API_KEY" \
-H "Content-Type: application/json" \
-d '{"fileName":"string","contentType":"string","contentBase64":"string"}'Response
201: the answer's fields
| Field | Type | Description |
|---|---|---|
id | string | The attachment id. |
fileName | string | |
contentType | string | |
sizeBytes | integer | |
uploadedAt | string (date-time) or null | |
createdAt | string (date-time) | |
url | string | View URL, valid for 10 minutes. |