Business units API
REST endpoints for business units in SKUFlow: 10 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 business units | GET /organizations/{organizationId}/business-units | read |
| Create a business unit | POST /organizations/{organizationId}/business-units | write |
| Get a business unit | GET /organizations/{organizationId}/business-units/{businessUnitId} | read |
| Change a business unit | PATCH /organizations/{organizationId}/business-units/{businessUnitId} | write |
| Delete a business unit | DELETE /organizations/{organizationId}/business-units/{businessUnitId} | sensitive |
| Accounting tracking choices for units | GET /organizations/{organizationId}/integrations/accounting-tracking | read |
| List branches | GET /organizations/{organizationId}/business-locations | read |
| Create a branch | POST /organizations/{organizationId}/business-locations | write |
| Change a branch | PATCH /organizations/{organizationId}/business-locations/{businessLocationId} | write |
| Delete a branch | DELETE /organizations/{organizationId}/business-locations/{businessLocationId} | sensitive |
List business units
GET /organizations/{organizationId}/business-units
The business's units (divisions such as Screen printing, Embroidery, Promotional products), active first, with their branding, default tax and accounting mapping. Empty for a business that does not use units. includeInactive adds retired ones. Use the ids as businessUnitId on quotes, invoices, requests and campaigns, and as the filter of lists and reports. Read-only.
| Permission | businessUnits.read (Owner, Admin, Staff, Member) |
| Risk | read, OAuth scope skuflow.read. Read: reads only. |
| MCP tool | businessUnits_list (toolset settings) |
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
includeInactive | query | boolean | No |
Example
curl "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/business-units" \
-H "Authorization: Bearer $SKUFLOW_API_KEY"Response
200: the answer's fields
| Field | Type | Description |
|---|---|---|
items | array of object | |
items[].id | string | |
items[].name | string | |
items[].trade | string or null | |
items[].active | boolean | |
items[].businessLocationId | string or null | |
items[].businessLocation | object or null | |
items[].businessLocation.id | string | |
items[].businessLocation.name | string | |
items[].phone | string or null | |
items[].email | string or null | |
items[].logoUrl | string or null | |
items[].invoiceFooter | string or null | |
items[].defaultTaxRate | number or null | |
items[].qboClassId | string or null | |
items[].qboClassName | string or null | |
items[].qboDepartmentId | string or null | |
items[].qboDepartmentName | string or null | |
items[].xeroTrackingCategoryId | string or null | |
items[].xeroTrackingCategoryName | string or null | |
items[].xeroTrackingOptionId | string or null | |
items[].xeroTrackingOptionName | string or null | |
items[].createdAt | string (date-time) | |
items[].updatedAt | string (date-time) |
Create a business unit
POST /organizations/{organizationId}/business-units
Adds a unit. Names are unique per business. Nothing moves into it by itself: set businessUnitId on quotes, invoices, requests and campaigns. Existing records are never backfilled.
| Permission | businessUnits.manage (Owner, Admin) |
| Risk | write, OAuth scope skuflow.write. Write: creates or changes records inside the business; nothing leaves it. |
| MCP tool | businessUnits_create (toolset settings) |
| Plan | Business units: the Pro plan and up. |
Request body
| Field | Type | Required | Description |
|---|---|---|---|
name | string | Yes | Up to 120 characters. |
trade | string or null | No | The division, free text ("Screen printing", "Embroidery"). Up to 60 characters. |
active | boolean | No | Inactive units keep their history but cannot be chosen for new work. |
businessLocationId | string or null | No | The branch it belongs to (GET /business-locations); null = none. |
phone | string or null | No | Shown on its invoices and quotes instead of the business's. Up to 40 characters. |
email | empty string or string (email) or null | No | Shown on its invoices and quotes instead of the business's. |
logoUrl | string or null | No | An https image URL shown on its invoices and quotes instead of the business logo. |
invoiceFooter | string or null | No | Text at the foot of its invoices and quotes (licence numbers, terms). Up to 2000 characters. |
defaultTaxRate | number or null | No | Percent: its new invoices and quotes use it when the property has no rate. 0–100. |
qboClassId | string or null | No | QuickBooks Class id its invoices carry. Up to 100 characters. |
qboClassName | string or null | No | Up to 200 characters. |
qboDepartmentId | string or null | No | QuickBooks Location (Department in the API) id its invoices carry. Up to 100 characters. |
qboDepartmentName | string or null | No | Up to 200 characters. |
xeroTrackingCategoryId | string or null | No | Xero tracking category; with an option, replaces the integration's default tracking on its invoices. Up to 100 characters. |
xeroTrackingCategoryName | string or null | No | Up to 200 characters. |
xeroTrackingOptionId | string or null | No | Up to 100 characters. |
xeroTrackingOptionName | string or null | No | Up to 200 characters. |
Example
curl -X POST "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/business-units" \
-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 | |
name | string | |
trade | string or null | |
active | boolean | |
businessLocationId | string or null | |
businessLocation | object or null | |
businessLocation.id | string | |
businessLocation.name | string | |
phone | string or null | |
email | string or null | |
logoUrl | string or null | |
invoiceFooter | string or null | |
defaultTaxRate | number or null | |
qboClassId | string or null | |
qboClassName | string or null | |
qboDepartmentId | string or null | |
qboDepartmentName | string or null | |
xeroTrackingCategoryId | string or null | |
xeroTrackingCategoryName | string or null | |
xeroTrackingOptionId | string or null | |
xeroTrackingOptionName | string or null | |
createdAt | string (date-time) | |
updatedAt | string (date-time) |
Get a business unit
GET /organizations/{organizationId}/business-units/{businessUnitId}
One business unit with its branding, default tax and accounting mapping. Read-only.
| Permission | businessUnits.read (Owner, Admin, Staff, Member) |
| Risk | read, OAuth scope skuflow.read. Read: reads only. |
| MCP tool | businessUnits_get (toolset settings) |
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
businessUnitId | path | string | Yes |
Example
curl "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/business-units/{businessUnitId}" \
-H "Authorization: Bearer $SKUFLOW_API_KEY"Response
200: the answer's fields
| Field | Type | Description |
|---|---|---|
id | string | |
name | string | |
trade | string or null | |
active | boolean | |
businessLocationId | string or null | |
businessLocation | object or null | |
businessLocation.id | string | |
businessLocation.name | string | |
phone | string or null | |
email | string or null | |
logoUrl | string or null | |
invoiceFooter | string or null | |
defaultTaxRate | number or null | |
qboClassId | string or null | |
qboClassName | string or null | |
qboDepartmentId | string or null | |
qboDepartmentName | string or null | |
xeroTrackingCategoryId | string or null | |
xeroTrackingCategoryName | string or null | |
xeroTrackingOptionId | string or null | |
xeroTrackingOptionName | string or null | |
createdAt | string (date-time) | |
updatedAt | string (date-time) |
Change a business unit
PATCH /organizations/{organizationId}/business-units/{businessUnitId}
Changes the fields sent. Branding shows on the unit's invoices and quotes at once (customer-visible); the accounting mapping applies to invoices pushed from now on. active: false retires it.
| Permission | businessUnits.manage (Owner, Admin) |
| Risk | write, OAuth scope skuflow.write. Write: creates or changes records inside the business; nothing leaves it. |
| MCP tool | businessUnits_update (toolset settings) |
| Plan | Business units: the Pro plan and up. |
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
businessUnitId | path | string | Yes |
Request body
| Field | Type | Required | Description |
|---|---|---|---|
name | string | No | Up to 120 characters. |
trade | string or null | No | The division, free text ("Screen printing", "Embroidery"). Up to 60 characters. |
active | boolean | No | Inactive units keep their history but cannot be chosen for new work. |
businessLocationId | string or null | No | The branch it belongs to (GET /business-locations); null = none. |
phone | string or null | No | Shown on its invoices and quotes instead of the business's. Up to 40 characters. |
email | empty string or string (email) or null | No | Shown on its invoices and quotes instead of the business's. |
logoUrl | string or null | No | An https image URL shown on its invoices and quotes instead of the business logo. |
invoiceFooter | string or null | No | Text at the foot of its invoices and quotes (licence numbers, terms). Up to 2000 characters. |
defaultTaxRate | number or null | No | Percent: its new invoices and quotes use it when the property has no rate. 0–100. |
qboClassId | string or null | No | QuickBooks Class id its invoices carry. Up to 100 characters. |
qboClassName | string or null | No | Up to 200 characters. |
qboDepartmentId | string or null | No | QuickBooks Location (Department in the API) id its invoices carry. Up to 100 characters. |
qboDepartmentName | string or null | No | Up to 200 characters. |
xeroTrackingCategoryId | string or null | No | Xero tracking category; with an option, replaces the integration's default tracking on its invoices. Up to 100 characters. |
xeroTrackingCategoryName | string or null | No | Up to 200 characters. |
xeroTrackingOptionId | string or null | No | Up to 100 characters. |
xeroTrackingOptionName | string or null | No | Up to 200 characters. |
Example
curl -X PATCH "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/business-units/{businessUnitId}" \
-H "Authorization: Bearer $SKUFLOW_API_KEY" \
-H "Content-Type: application/json" \
-d '{"name":"Dana Whitfield","trade":"string","active":true}'Response
200: the answer's fields
| Field | Type | Description |
|---|---|---|
id | string | |
name | string | |
trade | string or null | |
active | boolean | |
businessLocationId | string or null | |
businessLocation | object or null | |
businessLocation.id | string | |
businessLocation.name | string | |
phone | string or null | |
email | string or null | |
logoUrl | string or null | |
invoiceFooter | string or null | |
defaultTaxRate | number or null | |
qboClassId | string or null | |
qboClassName | string or null | |
qboDepartmentId | string or null | |
qboDepartmentName | string or null | |
xeroTrackingCategoryId | string or null | |
xeroTrackingCategoryName | string or null | |
xeroTrackingOptionId | string or null | |
xeroTrackingOptionName | string or null | |
createdAt | string (date-time) | |
updatedAt | string (date-time) |
Delete a business unit
DELETE /organizations/{organizationId}/business-units/{businessUnitId}
Deletes a unit nothing was recorded against (409 when any quote, invoice, request or campaign has it: retire it with active: false instead).
| Permission | businessUnits.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 | businessUnits_delete (toolset settings) |
| Approval | Over MCP, this tool always waits for your approval in SKUFlow. See Approvals. |
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
businessUnitId | path | string | Yes |
Example
curl -X DELETE "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/business-units/{businessUnitId}" \
-H "Authorization: Bearer $SKUFLOW_API_KEY"Response
200: the answer's fields
| Field | Type | Description |
|---|---|---|
ok | true |
Accounting tracking choices for units
GET /organizations/{organizationId}/integrations/accounting-tracking
What a business unit can map to in the connected accounting system, for the unit editor: QuickBooks Online classes and locations (qbo, Location is Department in QuickBooks), or Xero tracking categories with their options (xero). Only one accounting system is connected at a time; provider is null when neither is, and connected is false (no lists) when the connection needs a reconnect. Save the chosen ids and names on the unit with PATCH /business-units/{businessUnitId} (qboClassId/qboClassName, qboDepartmentId/qboDepartmentName, xeroTrackingCategoryId/Name, xeroTrackingOptionId/Name); invoices of the unit pushed afterwards carry them. 409 when the accounting system cannot be reached. Read-only.
| Permission | businessUnits.manage (Owner, Admin) |
| Risk | read, OAuth scope skuflow.read. Read: reads only. |
| MCP tool | businessUnits_accountingOptions (toolset settings) |
Example
curl "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/integrations/accounting-tracking" \
-H "Authorization: Bearer $SKUFLOW_API_KEY"Response
200: the answer's fields
| Field | Type | Description |
|---|---|---|
provider | enum or null | The connected accounting system; null = none. One of QUICKBOOKS, XERO. |
connected | boolean | False when none is connected or the connection needs a reconnect. |
qbo | object or null | |
qbo.classes | array of object | |
qbo.classes[].id | string | |
qbo.classes[].name | string | |
qbo.departments | array of object | QuickBooks Locations. |
qbo.departments[].id | string | |
qbo.departments[].name | string | |
xero | object or null | |
xero.trackingCategories | array of object | |
xero.trackingCategories[].id | string | |
xero.trackingCategories[].name | string | |
xero.trackingCategories[].options | array of object |
List branches
GET /organizations/{organizationId}/business-locations
Branches (locations) that group business units, with how many units each has. They share the business's timezone. Read-only.
| Permission | businessUnits.read (Owner, Admin, Staff, Member) |
| Risk | read, OAuth scope skuflow.read. Read: reads only. |
| MCP tool | businessLocations_list (toolset settings) |
Example
curl "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/business-locations" \
-H "Authorization: Bearer $SKUFLOW_API_KEY"Response
200: the answer's fields
| Field | Type | Description |
|---|---|---|
items | array of object | |
items[].id | string | |
items[].name | string | |
items[].address | string or null | |
items[].phone | string or null | |
items[].active | boolean | |
items[].createdAt | string (date-time) | |
items[].updatedAt | string (date-time) | |
items[]._count | object | |
items[]._count.units | integer |
Create a branch
POST /organizations/{organizationId}/business-locations
Adds a branch. Put units in it with PATCH /business-units/{id} businessLocationId.
| Permission | businessUnits.manage (Owner, Admin) |
| Risk | write, OAuth scope skuflow.write. Write: creates or changes records inside the business; nothing leaves it. |
| MCP tool | businessLocations_create (toolset settings) |
| Plan | Business units: the Pro plan and up. |
Request body
| Field | Type | Required | Description |
|---|---|---|---|
name | string | Yes | Up to 120 characters. |
address | string or null | No | Up to 500 characters. |
phone | string or null | No | Up to 40 characters. |
active | boolean | No |
Example
curl -X POST "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/business-locations" \
-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 | |
name | string | |
address | string or null | |
phone | string or null | |
active | boolean | |
createdAt | string (date-time) | |
updatedAt | string (date-time) | |
_count | object | |
_count.units | integer |
Change a branch
PATCH /organizations/{organizationId}/business-locations/{businessLocationId}
Changes the fields sent (name, address, phone, active). Its units stay in it; nothing else changes.
| Permission | businessUnits.manage (Owner, Admin) |
| Risk | write, OAuth scope skuflow.write. Write: creates or changes records inside the business; nothing leaves it. |
| MCP tool | businessLocations_update (toolset settings) |
| Plan | Business units: the Pro plan and up. |
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
businessLocationId | path | string | Yes |
Request body
| Field | Type | Required | Description |
|---|---|---|---|
name | string | No | Up to 120 characters. |
address | string or null | No | Up to 500 characters. |
phone | string or null | No | Up to 40 characters. |
active | boolean | No |
Example
curl -X PATCH "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/business-locations/{businessLocationId}" \
-H "Authorization: Bearer $SKUFLOW_API_KEY" \
-H "Content-Type: application/json" \
-d '{"name":"Dana Whitfield","address":"string","phone":"+15555550123"}'Response
200: the answer's fields
| Field | Type | Description |
|---|---|---|
id | string | |
name | string | |
address | string or null | |
phone | string or null | |
active | boolean | |
createdAt | string (date-time) | |
updatedAt | string (date-time) | |
_count | object | |
_count.units | integer |
Delete a branch
DELETE /organizations/{organizationId}/business-locations/{businessLocationId}
Deletes a branch; its units stay, without a branch.
| Permission | businessUnits.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 | businessLocations_delete (toolset settings) |
| Approval | Over MCP, this tool always waits for your approval in SKUFlow. See Approvals. |
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
businessLocationId | path | string | Yes |
Example
curl -X DELETE "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/business-locations/{businessLocationId}" \
-H "Authorization: Bearer $SKUFLOW_API_KEY"Response
200: the answer's fields
| Field | Type | Description |
|---|---|---|
ok | true |