Artwork API
REST endpoints for artwork in SKUFlow: 7 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 artwork | GET /organizations/{organizationId}/artwork | read |
| Upload artwork | POST /organizations/{organizationId}/artwork | write |
| Get an artwork with its versions | GET /organizations/{organizationId}/artwork/{artworkId} | read |
| Update an artwork | PATCH /organizations/{organizationId}/artwork/{artworkId} | write |
| Delete an artwork | DELETE /organizations/{organizationId}/artwork/{artworkId} | sensitive |
| Upload a new version of an artwork | POST /organizations/{organizationId}/artwork/{artworkId}/versions | write |
| Check artwork for a method and print size | GET /organizations/{organizationId}/artwork/{artworkId}/versions/{versionId}/check | read |
List artwork
GET /organizations/{organizationId}/artwork
The artwork library, newest first, each with its latest version: a customer's (customerId), the business's own (businessOnly), or all; search by name or tag. Read-only.
| Permission | decoration.read (Owner, Admin, Staff, Member) |
| Risk | read, OAuth scope skuflow.read. Read: reads only. |
| MCP tool | artwork_list (toolset decoration) |
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
customerId | query | string | No | |
businessOnly | query | boolean or enum | No | |
query | query | string | No | Free-text search over the list's names, numbers and contact details. Up to 200 characters. |
includeArchived | 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/artwork" \
-H "Authorization: Bearer $SKUFLOW_API_KEY"Response
200: the answer's fields
| Field | Type | Description |
|---|---|---|
items | array of object | |
items[].id | string | |
items[].customerId | string or null | Whose library; null = the business's own. |
items[].customer | object or null | |
items[].customer.id | string | |
items[].customer.name | string | |
items[].name | string | |
items[].tags | array of string | |
items[].currentVersion | integer | |
items[].archivedAt | string (date-time) or null | |
items[].createdAt | string (date-time) | |
items[].updatedAt | string (date-time) | |
items[].latest | object or null | |
items[].latest.id | string | Artwork version id (for design layers: artworkVersionId). |
items[].latest.artworkId | string | |
items[].latest.version | integer | |
items[].latest.fileName | string | |
items[].latest.contentType | string | image/png, image/jpeg, image/svg+xml or application/pdf. |
items[].latest.sizeBytes | integer | |
items[].latest.widthPx | integer or null | |
items[].latest.heightPx | integer or null | |
items[].latest.dpi | number or null | The resolution the file declares, when it does. |
items[].latest.isVector | boolean | |
items[].latest.hasTransparency | boolean or null | A transparent background (DTF needs one). |
items[].latest.colorCount | integer or null | Colours found (a hint for screen print). |
items[].latest.palette | array of string | |
items[].latest.note | string or null | |
items[].latest.url | string or null | The file (signed, 1 hour). |
items[].latest.displayUrl | string or null | What to show: a PNG preview of an SVG, else the file; null for a PDF. |
items[].latest.createdAt | string (date-time) | |
total | integer |
Upload artwork
POST /organizations/{organizationId}/artwork
Adds a file to the library in one call (the browser uses the same call): contentBase64 or a public sourceUrl, PNG, JPG, SVG or PDF up to 10 MB. The server measures it (resolution, vector, transparency, colours). SVGs with scripts or external links are refused. Returns the artwork and the new version's id (versionId, for design layers).
| Permission | designs.manage (Owner, Admin, Staff) |
| Risk | write, OAuth scope skuflow.write. Write: creates or changes records inside the business; nothing leaves it. |
| MCP tool | artwork_upload (toolset decoration) |
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. |
customerId | string or null | No | The customer's library (GET /customers); omitted = the business's own. |
name | string or null | No | Default: the file name. Up to 200 characters. |
tags | array of string | No | Up to 20 items. |
note | string or null | No | Up to 2000 characters. |
Example
curl -X POST "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/artwork" \
-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 |
|---|---|---|
artwork | object | |
artwork.id | string | |
artwork.customerId | string or null | Whose library; null = the business's own. |
artwork.customer | object or null | |
artwork.customer.id | string | |
artwork.customer.name | string | |
artwork.name | string | |
artwork.tags | array of string | |
artwork.currentVersion | integer | |
artwork.archivedAt | string (date-time) or null | |
artwork.versions | array of object | Newest first. |
artwork.versions[].id | string | Artwork version id (for design layers: artworkVersionId). |
artwork.versions[].artworkId | string | |
artwork.versions[].version | integer | |
artwork.versions[].fileName | string | |
artwork.versions[].contentType | string | image/png, image/jpeg, image/svg+xml or application/pdf. |
artwork.versions[].sizeBytes | integer | |
artwork.versions[].widthPx | integer or null | |
artwork.versions[].heightPx | integer or null | |
artwork.versions[].dpi | number or null | The resolution the file declares, when it does. |
artwork.versions[].isVector | boolean | |
artwork.versions[].hasTransparency | boolean or null | A transparent background (DTF needs one). |
artwork.versions[].colorCount | integer or null | Colours found (a hint for screen print). |
artwork.versions[].palette | array of string | |
artwork.versions[].note | string or null | |
artwork.versions[].url | string or null | The file (signed, 1 hour). |
artwork.versions[].displayUrl | string or null | What to show: a PNG preview of an SVG, else the file; null for a PDF. |
artwork.versions[].createdAt | string (date-time) | |
artwork.createdAt | string (date-time) | |
artwork.updatedAt | string (date-time) | |
versionId | string |
Get an artwork with its versions
GET /organizations/{organizationId}/artwork/{artworkId}
Every version (newest first) with what was measured: pixel size, declared dpi, vector, transparent background, colour count and palette, and signed links. Read-only.
| Permission | decoration.read (Owner, Admin, Staff, Member) |
| Risk | read, OAuth scope skuflow.read. Read: reads only. |
| MCP tool | artwork_get (toolset decoration) |
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
artworkId | path | string | Yes |
Example
curl "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/artwork/{artworkId}" \
-H "Authorization: Bearer $SKUFLOW_API_KEY"Response
200: the answer's fields
| Field | Type | Description |
|---|---|---|
id | string | |
customerId | string or null | Whose library; null = the business's own. |
customer | object or null | |
customer.id | string | |
customer.name | string | |
name | string | |
tags | array of string | |
currentVersion | integer | |
archivedAt | string (date-time) or null | |
versions | array of object | Newest first. |
versions[].id | string | Artwork version id (for design layers: artworkVersionId). |
versions[].artworkId | string | |
versions[].version | integer | |
versions[].fileName | string | |
versions[].contentType | string | image/png, image/jpeg, image/svg+xml or application/pdf. |
versions[].sizeBytes | integer | |
versions[].widthPx | integer or null | |
versions[].heightPx | integer or null | |
versions[].dpi | number or null | The resolution the file declares, when it does. |
versions[].isVector | boolean | |
versions[].hasTransparency | boolean or null | A transparent background (DTF needs one). |
versions[].colorCount | integer or null | Colours found (a hint for screen print). |
versions[].palette | array of string | |
versions[].note | string or null | |
versions[].url | string or null | The file (signed, 1 hour). |
versions[].displayUrl | string or null | What to show: a PNG preview of an SVG, else the file; null for a PDF. |
versions[].createdAt | string (date-time) | |
createdAt | string (date-time) | |
updatedAt | string (date-time) |
Update an artwork
PATCH /organizations/{organizationId}/artwork/{artworkId}
Renames, retags, moves it to another customer's library (or the business's: customerId: null) or archives it (archived).
| Permission | designs.manage (Owner, Admin, Staff) |
| Risk | write, OAuth scope skuflow.write. Write: creates or changes records inside the business; nothing leaves it. |
| MCP tool | artwork_update (toolset decoration) |
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
artworkId | path | string | Yes |
Request body
| Field | Type | Required | Description |
|---|---|---|---|
name | string | No | Up to 200 characters. |
tags | array of string | No | Up to 20 items. |
customerId | string or null | No | |
archived | boolean | No |
Example
curl -X PATCH "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/artwork/{artworkId}" \
-H "Authorization: Bearer $SKUFLOW_API_KEY" \
-H "Content-Type: application/json" \
-d '{"name":"Dana Whitfield","tags":["string"],"customerId":"customer_id"}'Response
200: the answer's fields
| Field | Type | Description |
|---|---|---|
id | string | |
customerId | string or null | Whose library; null = the business's own. |
customer | object or null | |
customer.id | string | |
customer.name | string | |
name | string | |
tags | array of string | |
currentVersion | integer | |
archivedAt | string (date-time) or null | |
versions | array of object | Newest first. |
versions[].id | string | Artwork version id (for design layers: artworkVersionId). |
versions[].artworkId | string | |
versions[].version | integer | |
versions[].fileName | string | |
versions[].contentType | string | image/png, image/jpeg, image/svg+xml or application/pdf. |
versions[].sizeBytes | integer | |
versions[].widthPx | integer or null | |
versions[].heightPx | integer or null | |
versions[].dpi | number or null | The resolution the file declares, when it does. |
versions[].isVector | boolean | |
versions[].hasTransparency | boolean or null | A transparent background (DTF needs one). |
versions[].colorCount | integer or null | Colours found (a hint for screen print). |
versions[].palette | array of string | |
versions[].note | string or null | |
versions[].url | string or null | The file (signed, 1 hour). |
versions[].displayUrl | string or null | What to show: a PNG preview of an SVG, else the file; null for a PDF. |
versions[].createdAt | string (date-time) | |
createdAt | string (date-time) | |
updatedAt | string (date-time) |
Delete an artwork
DELETE /organizations/{organizationId}/artwork/{artworkId}
Destructive: deletes the artwork and every version. Refused while a design places it (archive it instead).
| Permission | designs.manage (Owner, Admin, Staff) |
| Risk | sensitive, OAuth scope skuflow.sensitive. Sensitive: moves money, deletes, sends or shows something to a customer, or grants or revokes access. |
| MCP tool | artwork_delete (toolset decoration) |
| Approval | Over MCP, this tool always waits for your approval in SKUFlow. See Approvals. |
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
artworkId | path | string | Yes |
Example
curl -X DELETE "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/artwork/{artworkId}" \
-H "Authorization: Bearer $SKUFLOW_API_KEY"Response
200: the answer's fields
| Field | Type | Description |
|---|---|---|
ok | true |
Upload a new version of an artwork
POST /organizations/{organizationId}/artwork/{artworkId}/versions
Adds the next version (same file rules as upload). Designs keep the version they place until they are changed to the new one.
| Permission | designs.manage (Owner, Admin, Staff) |
| Risk | write, OAuth scope skuflow.write. Write: creates or changes records inside the business; nothing leaves it. |
| MCP tool | artwork_addVersion (toolset decoration) |
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
artworkId | 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. |
note | string or null | No | Up to 2000 characters. |
Example
curl -X POST "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/artwork/{artworkId}/versions" \
-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 |
|---|---|---|
artwork | object | |
artwork.id | string | |
artwork.customerId | string or null | Whose library; null = the business's own. |
artwork.customer | object or null | |
artwork.customer.id | string | |
artwork.customer.name | string | |
artwork.name | string | |
artwork.tags | array of string | |
artwork.currentVersion | integer | |
artwork.archivedAt | string (date-time) or null | |
artwork.versions | array of object | Newest first. |
artwork.versions[].id | string | Artwork version id (for design layers: artworkVersionId). |
artwork.versions[].artworkId | string | |
artwork.versions[].version | integer | |
artwork.versions[].fileName | string | |
artwork.versions[].contentType | string | image/png, image/jpeg, image/svg+xml or application/pdf. |
artwork.versions[].sizeBytes | integer | |
artwork.versions[].widthPx | integer or null | |
artwork.versions[].heightPx | integer or null | |
artwork.versions[].dpi | number or null | The resolution the file declares, when it does. |
artwork.versions[].isVector | boolean | |
artwork.versions[].hasTransparency | boolean or null | A transparent background (DTF needs one). |
artwork.versions[].colorCount | integer or null | Colours found (a hint for screen print). |
artwork.versions[].palette | array of string | |
artwork.versions[].note | string or null | |
artwork.versions[].url | string or null | The file (signed, 1 hour). |
artwork.versions[].displayUrl | string or null | What to show: a PNG preview of an SVG, else the file; null for a PDF. |
artwork.versions[].createdAt | string (date-time) | |
artwork.createdAt | string (date-time) | |
artwork.updatedAt | string (date-time) | |
versionId | string |
Check artwork for a method and print size
GET /organizations/{organizationId}/artwork/{artworkId}/versions/{versionId}/check
Print warnings for this file with a method and size: under 300 dpi at the print size (a problem under 150), raster art for screen print or embroidery, no transparent background for DTF, more colours than the ink colours priced. Read-only.
| Permission | decoration.read (Owner, Admin, Staff, Member) |
| Risk | read, OAuth scope skuflow.read. Read: reads only. |
| MCP tool | artwork_check (toolset decoration) |
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
artworkId | path | string | Yes | |
versionId | path | string | Yes | |
methodId | query | string | No | A decoration method (its type decides the checks). |
printWidthIn | query | number | No | At most 10000. |
printHeightIn | query | number | No | At most 10000. |
inkColors | query | integer | No | 1–30. |
Example
curl "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/artwork/{artworkId}/versions/{versionId}/check" \
-H "Authorization: Bearer $SKUFLOW_API_KEY"Response
200: the answer's fields
| Field | Type | Description |
|---|---|---|
checks | array of object | |
checks[].code | string | |
checks[].severity | string | |
checks[].message | string |