Imports API
REST endpoints for imports in SKUFlow: 18 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 |
|---|---|---|
| Import sources and fields | GET /organizations/{organizationId}/migration/sources | read |
| List imports | GET /organizations/{organizationId}/imports | read |
| Start an import | POST /organizations/{organizationId}/imports | write |
| Get an import | GET /organizations/{organizationId}/imports/{importId} | read |
| Delete a draft import | DELETE /organizations/{organizationId}/imports/{importId} | sensitive |
| Add a file (content in the request) | POST /organizations/{organizationId}/imports/{importId}/files | write |
| Get an upload URL | POST /organizations/{organizationId}/imports/{importId}/uploads | write |
| Confirm an upload | POST /organizations/{organizationId}/imports/{importId}/uploads/{uploadId}/confirm | write |
| Set a file's dataset or mapping | PATCH /organizations/{organizationId}/imports/{importId}/files/{fileId} | write |
| Remove a file from an import | DELETE /organizations/{organizationId}/imports/{importId}/files/{fileId} | sensitive |
| AI column mapping | POST /organizations/{organizationId}/imports/{importId}/files/{fileId}/suggest-mapping | write |
| Preview an import (dry run) | POST /organizations/{organizationId}/imports/{importId}/preview | write |
| Apply an import | POST /organizations/{organizationId}/imports/{importId}/apply | sensitive |
| Undo an import | POST /organizations/{organizationId}/imports/{importId}/undo | sensitive |
| Cutover checklist | GET /organizations/{organizationId}/migration/cutover | read |
| Release imported records (cutover) | POST /organizations/{organizationId}/migration/cutover/release | sensitive |
| Customers to ask for a card | GET /organizations/{organizationId}/migration/needs-card | read |
| Send update-card links | POST /organizations/{organizationId}/migration/update-card-links | sensitive |
Import sources and fields
GET /organizations/{organizationId}/migration/sources
What can be imported: the sources (DECONETWORK, SPREADSHEET = "Other spreadsheet": any other tool such as Printavo or InkSoft, or a hand-made sheet), each with the steps to export every dataset it has a preset for, and the SKUFlow fields of each dataset (mapping targets). DecoNetwork's presets (customers, the order items export as invoices, the payments export) were checked against real exports (verified); unknown columns go to AI mapping. Read-only. Next: POST /imports.
| Permission | import.manage (Owner, Admin) |
| Risk | read, OAuth scope skuflow.read. Read: reads only. |
| MCP tool | imports_sources (toolset settings) |
Example
curl "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/migration/sources" \
-H "Authorization: Bearer $SKUFLOW_API_KEY"Response
200: the answer's fields
| Field | Type | Description |
|---|---|---|
maxFileBytes | integer | |
sources | array of object | |
sources[].source | enum | One of DECONETWORK, SPREADSHEET. |
sources[].label | string | |
sources[].verified | boolean | Every preset of the source was checked against a real export file. |
sources[].datasets | array of object | |
sources[].datasets[].dataset | enum | One of pricebook, customers, contacts, properties, quotes, invoices, payments, notes. |
sources[].datasets[].howToExport | array of string | |
sources[].datasets[].verified | boolean | This preset was checked against a real export file of that system. |
datasets | array of object | |
datasets[].dataset | enum | One of pricebook, customers, contacts, properties, quotes, invoices, payments, notes. |
datasets[].fields | array of object | |
datasets[].fields[].key | string | |
datasets[].fields[].label | string | |
datasets[].fields[].type | string | |
datasets[].fields[].description | string |
List imports
GET /organizations/{organizationId}/imports
The business's imports, newest first (the last 50), with files, progress, results and whether undo is still possible. Read-only.
| Permission | import.manage (Owner, Admin) |
| Risk | read, OAuth scope skuflow.read. Read: reads only. |
| MCP tool | imports_list (toolset settings) |
Example
curl "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/imports" \
-H "Authorization: Bearer $SKUFLOW_API_KEY"Response
200: the answer's fields
An array of objects:
| Field | Type | Description |
|---|---|---|
id | string | |
source | enum | One of DECONETWORK, SPREADSHEET. |
status | enum | One of DRAFT, QUEUED, RUNNING, COMPLETED, FAILED, UNDONE. |
lockHistory | boolean | |
progress | object | |
progress.phase | string | |
progress.done | number | |
progress.total | number | |
preview | object or null | The last dry run; null until previewed or after a change. |
preview.counts | object | Per entity: customers, properties, quotes, invoices, payments… |
preview.problems | array of object | |
preview.problems[].fileId | string or null | |
preview.problems[].fileName | string or null | |
preview.problems[].row | integer or null | 1-based line in the file (the header is line 1). |
preview.problems[].column | string or null | |
preview.problems[].severity | enum | Errors skip the row; warnings are only reported. One of error, warning. |
preview.problems[].message | string | |
preview.errors | integer | |
preview.warnings | integer | |
preview.samples | object | A few records as they will look. |
preview.openingBalances | object | |
preview.openingBalances.payments | integer | "Opening balance (imported)" payments so invoice balances match the export. |
preview.openingBalances.invoices | integer | Opening-balance invoices for account balances without open invoices. |
preview.openingBalances.amountCents | integer | |
preview.needsPaymentMethod | integer | Customers who paid by card on file or autopay: to re-collect. |
preview.files | integer | |
preview.rows | integer | |
previewedAt | string (date-time) or null | |
summary | object or null | What the applied run did, per entity. |
problems | array of object | |
problems[].fileId | string or null | |
problems[].fileName | string or null | |
problems[].row | integer or null | 1-based line in the file (the header is line 1). |
problems[].column | string or null | |
problems[].severity | enum | Errors skip the row; warnings are only reported. One of error, warning. |
problems[].message | string | |
queuedAt | string (date-time) or null | |
startedAt | string (date-time) or null | |
finishedAt | string (date-time) or null | |
error | string or null | |
undoUntil | string (date-time) or null | |
canUndo | boolean | |
undoneAt | string (date-time) or null | |
undoReport | object or null | |
files | array of object | |
files[].id | string | |
files[].uploadId | string | |
files[].fileName | string | |
files[].sheetName | string or null | |
files[].sizeBytes | integer | |
files[].status | enum | One of UPLOADING, READY, ERROR. |
files[].error | string or null | |
files[].dataset | enum or null | What the rows are; null = not recognised (skipped until set). One of pricebook, customers, contacts, properties, quotes, invoices, payments, notes. |
files[].detectedDataset | enum or null | One of pricebook, customers, contacts, properties, quotes, invoices, payments, notes. |
files[].detectionConfidence | number or null | |
files[].headers | array of string | |
files[].rowCount | integer | |
files[].sampleRows | array of array of string | |
files[].mapping | object | |
files[].needsReview | array of string | Headers mapped by a guess below 0.7 confidence: confirm them. |
files[].createdAt | string (date-time) | |
createdAt | string (date-time) |
Start an import
POST /organizations/{organizationId}/imports
Creates a draft import from one source. Nothing is written to customers, quotes or invoices until it is applied. Next: add files (POST /imports/{importId}/files), check the mapping, preview, apply. A re-run on cutover day is a new import on fresh exports: records match by their source id (then email/phone, address, code, number) and are updated in place, never duplicated.
| Permission | import.manage (Owner, Admin) |
| Risk | write, OAuth scope skuflow.write. Write: creates or changes records inside the business; nothing leaves it. |
| MCP tool | imports_create (toolset settings) |
Request body
| Field | Type | Required | Description |
|---|---|---|---|
source | enum | Yes | DECONETWORK or SPREADSHEET (any other tool or a hand-made sheet). One of DECONETWORK, SPREADSHEET. |
lockHistory | boolean | No | Imported paid or void invoices are read-only (default true). |
Example
curl -X POST "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/imports" \
-H "Authorization: Bearer $SKUFLOW_API_KEY" \
-H "Content-Type: application/json" \
-d '{"source":"DECONETWORK"}'Response
200: the answer's fields
| Field | Type | Description |
|---|---|---|
id | string | |
source | enum | One of DECONETWORK, SPREADSHEET. |
status | enum | One of DRAFT, QUEUED, RUNNING, COMPLETED, FAILED, UNDONE. |
lockHistory | boolean | |
progress | object | |
progress.phase | string | |
progress.done | number | |
progress.total | number | |
preview | object or null | The last dry run; null until previewed or after a change. |
preview.counts | object | Per entity: customers, properties, quotes, invoices, payments… |
preview.problems | array of object | |
preview.problems[].fileId | string or null | |
preview.problems[].fileName | string or null | |
preview.problems[].row | integer or null | 1-based line in the file (the header is line 1). |
preview.problems[].column | string or null | |
preview.problems[].severity | enum | Errors skip the row; warnings are only reported. One of error, warning. |
preview.problems[].message | string | |
preview.errors | integer | |
preview.warnings | integer | |
preview.samples | object | A few records as they will look. |
preview.openingBalances | object | |
preview.openingBalances.payments | integer | "Opening balance (imported)" payments so invoice balances match the export. |
preview.openingBalances.invoices | integer | Opening-balance invoices for account balances without open invoices. |
preview.openingBalances.amountCents | integer | |
preview.needsPaymentMethod | integer | Customers who paid by card on file or autopay: to re-collect. |
preview.files | integer | |
preview.rows | integer | |
previewedAt | string (date-time) or null | |
summary | object or null | What the applied run did, per entity. |
problems | array of object | |
problems[].fileId | string or null | |
problems[].fileName | string or null | |
problems[].row | integer or null | 1-based line in the file (the header is line 1). |
problems[].column | string or null | |
problems[].severity | enum | Errors skip the row; warnings are only reported. One of error, warning. |
problems[].message | string | |
queuedAt | string (date-time) or null | |
startedAt | string (date-time) or null | |
finishedAt | string (date-time) or null | |
error | string or null | |
undoUntil | string (date-time) or null | |
canUndo | boolean | |
undoneAt | string (date-time) or null | |
undoReport | object or null | |
files | array of object | |
files[].id | string | |
files[].uploadId | string | |
files[].fileName | string | |
files[].sheetName | string or null | |
files[].sizeBytes | integer | |
files[].status | enum | One of UPLOADING, READY, ERROR. |
files[].error | string or null | |
files[].dataset | enum or null | What the rows are; null = not recognised (skipped until set). One of pricebook, customers, contacts, properties, quotes, invoices, payments, notes. |
files[].detectedDataset | enum or null | One of pricebook, customers, contacts, properties, quotes, invoices, payments, notes. |
files[].detectionConfidence | number or null | |
files[].headers | array of string | |
files[].rowCount | integer | |
files[].sampleRows | array of array of string | |
files[].mapping | object | |
files[].needsReview | array of string | Headers mapped by a guess below 0.7 confidence: confirm them. |
files[].createdAt | string (date-time) | |
createdAt | string (date-time) |
Get an import
GET /organizations/{organizationId}/imports/{importId}
One import: its files with their detected dataset and column mapping, the last preview, progress while it runs (progress.done of progress.total rows), the summary and problems when finished, and the undo deadline. Poll it while status is QUEUED or RUNNING. Read-only.
| Permission | import.manage (Owner, Admin) |
| Risk | read, OAuth scope skuflow.read. Read: reads only. |
| MCP tool | imports_get (toolset settings) |
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
importId | path | string | Yes | The import run (from POST /imports or GET /imports). |
Example
curl "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/imports/{importId}" \
-H "Authorization: Bearer $SKUFLOW_API_KEY"Response
200: the answer's fields
| Field | Type | Description |
|---|---|---|
id | string | |
source | enum | One of DECONETWORK, SPREADSHEET. |
status | enum | One of DRAFT, QUEUED, RUNNING, COMPLETED, FAILED, UNDONE. |
lockHistory | boolean | |
progress | object | |
progress.phase | string | |
progress.done | number | |
progress.total | number | |
preview | object or null | The last dry run; null until previewed or after a change. |
preview.counts | object | Per entity: customers, properties, quotes, invoices, payments… |
preview.problems | array of object | |
preview.problems[].fileId | string or null | |
preview.problems[].fileName | string or null | |
preview.problems[].row | integer or null | 1-based line in the file (the header is line 1). |
preview.problems[].column | string or null | |
preview.problems[].severity | enum | Errors skip the row; warnings are only reported. One of error, warning. |
preview.problems[].message | string | |
preview.errors | integer | |
preview.warnings | integer | |
preview.samples | object | A few records as they will look. |
preview.openingBalances | object | |
preview.openingBalances.payments | integer | "Opening balance (imported)" payments so invoice balances match the export. |
preview.openingBalances.invoices | integer | Opening-balance invoices for account balances without open invoices. |
preview.openingBalances.amountCents | integer | |
preview.needsPaymentMethod | integer | Customers who paid by card on file or autopay: to re-collect. |
preview.files | integer | |
preview.rows | integer | |
previewedAt | string (date-time) or null | |
summary | object or null | What the applied run did, per entity. |
problems | array of object | |
problems[].fileId | string or null | |
problems[].fileName | string or null | |
problems[].row | integer or null | 1-based line in the file (the header is line 1). |
problems[].column | string or null | |
problems[].severity | enum | Errors skip the row; warnings are only reported. One of error, warning. |
problems[].message | string | |
queuedAt | string (date-time) or null | |
startedAt | string (date-time) or null | |
finishedAt | string (date-time) or null | |
error | string or null | |
undoUntil | string (date-time) or null | |
canUndo | boolean | |
undoneAt | string (date-time) or null | |
undoReport | object or null | |
files | array of object | |
files[].id | string | |
files[].uploadId | string | |
files[].fileName | string | |
files[].sheetName | string or null | |
files[].sizeBytes | integer | |
files[].status | enum | One of UPLOADING, READY, ERROR. |
files[].error | string or null | |
files[].dataset | enum or null | What the rows are; null = not recognised (skipped until set). One of pricebook, customers, contacts, properties, quotes, invoices, payments, notes. |
files[].detectedDataset | enum or null | One of pricebook, customers, contacts, properties, quotes, invoices, payments, notes. |
files[].detectionConfidence | number or null | |
files[].headers | array of string | |
files[].rowCount | integer | |
files[].sampleRows | array of array of string | |
files[].mapping | object | |
files[].needsReview | array of string | Headers mapped by a guess below 0.7 confidence: confirm them. |
files[].createdAt | string (date-time) | |
createdAt | string (date-time) |
Delete a draft import
DELETE /organizations/{organizationId}/imports/{importId}
DELETES the draft import and its uploaded files. Only an import never applied (DRAFT); an applied one is undone instead (POST …/undo).
| Permission | import.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 | imports_delete (toolset settings) |
| Approval | Over MCP, this tool always waits for your approval in SKUFlow. See Approvals. |
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
importId | path | string | Yes | The import run (from POST /imports or GET /imports). |
Example
curl -X DELETE "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/imports/{importId}" \
-H "Authorization: Bearer $SKUFLOW_API_KEY"Response
200: the answer's fields
| Field | Type | Description |
|---|---|---|
deleted | true |
Add a file (content in the request)
POST /organizations/{organizationId}/imports/{importId}/files
Adds an export to the import in one call: text for CSV / TSV, or contentBase64 for any file including .xlsx (each sheet becomes a file of the import). It is stored privately, read, and sniffed: the dataset it holds (customers, contacts, properties, pricebook, quotes, invoices, payments, notes) and the mapping from the source's preset, the saved mapping and the name heuristic. Several files may hold one dataset (a list split into several exports). The browser uses POST …/uploads instead. Returns the import.
| Permission | import.manage (Owner, Admin) |
| Risk | write, OAuth scope skuflow.write. Write: creates or changes records inside the business; nothing leaves it. |
| MCP tool | imports_addFile (toolset settings) |
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
importId | path | string | Yes | The import run (from POST /imports or GET /imports). |
Request body
| Field | Type | Required | Description |
|---|---|---|---|
fileName | string | Yes | The file's name, with its extension (.csv, .tsv or .xlsx). Up to 255 characters. |
text | string | No | The CSV/TSV text. |
contentBase64 | string | No | The file's bytes as base64 (required for .xlsx). |
Example
curl -X POST "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/imports/{importId}/files" \
-H "Authorization: Bearer $SKUFLOW_API_KEY" \
-H "Content-Type: application/json" \
-d '{"fileName":"string"}'Response
200: the answer's fields
| Field | Type | Description |
|---|---|---|
id | string | |
source | enum | One of DECONETWORK, SPREADSHEET. |
status | enum | One of DRAFT, QUEUED, RUNNING, COMPLETED, FAILED, UNDONE. |
lockHistory | boolean | |
progress | object | |
progress.phase | string | |
progress.done | number | |
progress.total | number | |
preview | object or null | The last dry run; null until previewed or after a change. |
preview.counts | object | Per entity: customers, properties, quotes, invoices, payments… |
preview.problems | array of object | |
preview.problems[].fileId | string or null | |
preview.problems[].fileName | string or null | |
preview.problems[].row | integer or null | 1-based line in the file (the header is line 1). |
preview.problems[].column | string or null | |
preview.problems[].severity | enum | Errors skip the row; warnings are only reported. One of error, warning. |
preview.problems[].message | string | |
preview.errors | integer | |
preview.warnings | integer | |
preview.samples | object | A few records as they will look. |
preview.openingBalances | object | |
preview.openingBalances.payments | integer | "Opening balance (imported)" payments so invoice balances match the export. |
preview.openingBalances.invoices | integer | Opening-balance invoices for account balances without open invoices. |
preview.openingBalances.amountCents | integer | |
preview.needsPaymentMethod | integer | Customers who paid by card on file or autopay: to re-collect. |
preview.files | integer | |
preview.rows | integer | |
previewedAt | string (date-time) or null | |
summary | object or null | What the applied run did, per entity. |
problems | array of object | |
problems[].fileId | string or null | |
problems[].fileName | string or null | |
problems[].row | integer or null | 1-based line in the file (the header is line 1). |
problems[].column | string or null | |
problems[].severity | enum | Errors skip the row; warnings are only reported. One of error, warning. |
problems[].message | string | |
queuedAt | string (date-time) or null | |
startedAt | string (date-time) or null | |
finishedAt | string (date-time) or null | |
error | string or null | |
undoUntil | string (date-time) or null | |
canUndo | boolean | |
undoneAt | string (date-time) or null | |
undoReport | object or null | |
files | array of object | |
files[].id | string | |
files[].uploadId | string | |
files[].fileName | string | |
files[].sheetName | string or null | |
files[].sizeBytes | integer | |
files[].status | enum | One of UPLOADING, READY, ERROR. |
files[].error | string or null | |
files[].dataset | enum or null | What the rows are; null = not recognised (skipped until set). One of pricebook, customers, contacts, properties, quotes, invoices, payments, notes. |
files[].detectedDataset | enum or null | One of pricebook, customers, contacts, properties, quotes, invoices, payments, notes. |
files[].detectionConfidence | number or null | |
files[].headers | array of string | |
files[].rowCount | integer | |
files[].sampleRows | array of array of string | |
files[].mapping | object | |
files[].needsReview | array of string | Headers mapped by a guess below 0.7 confidence: confirm them. |
files[].createdAt | string (date-time) | |
createdAt | string (date-time) |
Get an upload URL
POST /organizations/{organizationId}/imports/{importId}/uploads
Step 1 of a browser upload: a signed URL to PUT the file to (10 minutes, with the same Content-Type). Then POST …/uploads/{uploadId}/confirm to read and sniff it.
| Permission | import.manage (Owner, Admin) |
| Risk | write, OAuth scope skuflow.write. Write: creates or changes records inside the business; nothing leaves it. |
| MCP tool | imports_createUpload (toolset settings) |
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
importId | path | string | Yes | The import run (from POST /imports or GET /imports). |
Request body
| Field | Type | Required | Description |
|---|---|---|---|
fileName | string | Yes | The file's name, with its extension (.csv, .tsv or .xlsx). Up to 255 characters. |
contentType | string | Yes | Up to 200 characters. |
sizeBytes | integer | Yes | 1–26214400. |
Example
curl -X POST "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/imports/{importId}/uploads" \
-H "Authorization: Bearer $SKUFLOW_API_KEY" \
-H "Content-Type: application/json" \
-d '{"fileName":"string","contentType":"string","sizeBytes":1}'Response
200: the answer's fields
| Field | Type | Description |
|---|---|---|
uploadId | string | |
uploadUrl | string |
Confirm an upload
POST /organizations/{organizationId}/imports/{importId}/uploads/{uploadId}/confirm
Step 2 of a browser upload: reads the uploaded file, sniffs each sheet and maps its columns. Returns the import.
| Permission | import.manage (Owner, Admin) |
| Risk | write, OAuth scope skuflow.write. Write: creates or changes records inside the business; nothing leaves it. |
| MCP tool | imports_confirmUpload (toolset settings) |
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
importId | path | string | Yes | The import run (from POST /imports or GET /imports). |
uploadId | path | string | Yes | From POST …/uploads. |
Example
curl -X POST "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/imports/{importId}/uploads/{uploadId}/confirm" \
-H "Authorization: Bearer $SKUFLOW_API_KEY"Response
200: the answer's fields
| Field | Type | Description |
|---|---|---|
id | string | |
source | enum | One of DECONETWORK, SPREADSHEET. |
status | enum | One of DRAFT, QUEUED, RUNNING, COMPLETED, FAILED, UNDONE. |
lockHistory | boolean | |
progress | object | |
progress.phase | string | |
progress.done | number | |
progress.total | number | |
preview | object or null | The last dry run; null until previewed or after a change. |
preview.counts | object | Per entity: customers, properties, quotes, invoices, payments… |
preview.problems | array of object | |
preview.problems[].fileId | string or null | |
preview.problems[].fileName | string or null | |
preview.problems[].row | integer or null | 1-based line in the file (the header is line 1). |
preview.problems[].column | string or null | |
preview.problems[].severity | enum | Errors skip the row; warnings are only reported. One of error, warning. |
preview.problems[].message | string | |
preview.errors | integer | |
preview.warnings | integer | |
preview.samples | object | A few records as they will look. |
preview.openingBalances | object | |
preview.openingBalances.payments | integer | "Opening balance (imported)" payments so invoice balances match the export. |
preview.openingBalances.invoices | integer | Opening-balance invoices for account balances without open invoices. |
preview.openingBalances.amountCents | integer | |
preview.needsPaymentMethod | integer | Customers who paid by card on file or autopay: to re-collect. |
preview.files | integer | |
preview.rows | integer | |
previewedAt | string (date-time) or null | |
summary | object or null | What the applied run did, per entity. |
problems | array of object | |
problems[].fileId | string or null | |
problems[].fileName | string or null | |
problems[].row | integer or null | 1-based line in the file (the header is line 1). |
problems[].column | string or null | |
problems[].severity | enum | Errors skip the row; warnings are only reported. One of error, warning. |
problems[].message | string | |
queuedAt | string (date-time) or null | |
startedAt | string (date-time) or null | |
finishedAt | string (date-time) or null | |
error | string or null | |
undoUntil | string (date-time) or null | |
canUndo | boolean | |
undoneAt | string (date-time) or null | |
undoReport | object or null | |
files | array of object | |
files[].id | string | |
files[].uploadId | string | |
files[].fileName | string | |
files[].sheetName | string or null | |
files[].sizeBytes | integer | |
files[].status | enum | One of UPLOADING, READY, ERROR. |
files[].error | string or null | |
files[].dataset | enum or null | What the rows are; null = not recognised (skipped until set). One of pricebook, customers, contacts, properties, quotes, invoices, payments, notes. |
files[].detectedDataset | enum or null | One of pricebook, customers, contacts, properties, quotes, invoices, payments, notes. |
files[].detectionConfidence | number or null | |
files[].headers | array of string | |
files[].rowCount | integer | |
files[].sampleRows | array of array of string | |
files[].mapping | object | |
files[].needsReview | array of string | Headers mapped by a guess below 0.7 confidence: confirm them. |
files[].createdAt | string (date-time) | |
createdAt | string (date-time) |
Set a file's dataset or mapping
PATCH /organizations/{organizationId}/imports/{importId}/files/{fileId}
Confirms or corrects what a file holds (dataset; null skips the file; changing it re-maps the columns) and its column mapping (mapping: header → field key from GET /migration/sources, custom:<label> for a new custom field on customers or properties, or null to skip). Confirmed columns are remembered for the next upload of that kind of file. Clears the preview. Returns the import.
| Permission | import.manage (Owner, Admin) |
| Risk | write, OAuth scope skuflow.write. Write: creates or changes records inside the business; nothing leaves it. |
| MCP tool | imports_updateFile (toolset settings) |
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
importId | path | string | Yes | The import run (from POST /imports or GET /imports). |
fileId | path | string | Yes | A file of the import (one per CSV, or per sheet of a workbook). |
Request body
| Field | Type | Required | Description |
|---|---|---|---|
dataset | enum or null | No | One of pricebook, customers, contacts, properties, quotes, invoices, payments, notes. |
mapping | object | No |
Example
curl -X PATCH "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/imports/{importId}/files/{fileId}" \
-H "Authorization: Bearer $SKUFLOW_API_KEY" \
-H "Content-Type: application/json" \
-d '{"dataset":"pricebook","mapping":{}}'Response
200: the answer's fields
| Field | Type | Description |
|---|---|---|
id | string | |
source | enum | One of DECONETWORK, SPREADSHEET. |
status | enum | One of DRAFT, QUEUED, RUNNING, COMPLETED, FAILED, UNDONE. |
lockHistory | boolean | |
progress | object | |
progress.phase | string | |
progress.done | number | |
progress.total | number | |
preview | object or null | The last dry run; null until previewed or after a change. |
preview.counts | object | Per entity: customers, properties, quotes, invoices, payments… |
preview.problems | array of object | |
preview.problems[].fileId | string or null | |
preview.problems[].fileName | string or null | |
preview.problems[].row | integer or null | 1-based line in the file (the header is line 1). |
preview.problems[].column | string or null | |
preview.problems[].severity | enum | Errors skip the row; warnings are only reported. One of error, warning. |
preview.problems[].message | string | |
preview.errors | integer | |
preview.warnings | integer | |
preview.samples | object | A few records as they will look. |
preview.openingBalances | object | |
preview.openingBalances.payments | integer | "Opening balance (imported)" payments so invoice balances match the export. |
preview.openingBalances.invoices | integer | Opening-balance invoices for account balances without open invoices. |
preview.openingBalances.amountCents | integer | |
preview.needsPaymentMethod | integer | Customers who paid by card on file or autopay: to re-collect. |
preview.files | integer | |
preview.rows | integer | |
previewedAt | string (date-time) or null | |
summary | object or null | What the applied run did, per entity. |
problems | array of object | |
problems[].fileId | string or null | |
problems[].fileName | string or null | |
problems[].row | integer or null | 1-based line in the file (the header is line 1). |
problems[].column | string or null | |
problems[].severity | enum | Errors skip the row; warnings are only reported. One of error, warning. |
problems[].message | string | |
queuedAt | string (date-time) or null | |
startedAt | string (date-time) or null | |
finishedAt | string (date-time) or null | |
error | string or null | |
undoUntil | string (date-time) or null | |
canUndo | boolean | |
undoneAt | string (date-time) or null | |
undoReport | object or null | |
files | array of object | |
files[].id | string | |
files[].uploadId | string | |
files[].fileName | string | |
files[].sheetName | string or null | |
files[].sizeBytes | integer | |
files[].status | enum | One of UPLOADING, READY, ERROR. |
files[].error | string or null | |
files[].dataset | enum or null | What the rows are; null = not recognised (skipped until set). One of pricebook, customers, contacts, properties, quotes, invoices, payments, notes. |
files[].detectedDataset | enum or null | One of pricebook, customers, contacts, properties, quotes, invoices, payments, notes. |
files[].detectionConfidence | number or null | |
files[].headers | array of string | |
files[].rowCount | integer | |
files[].sampleRows | array of array of string | |
files[].mapping | object | |
files[].needsReview | array of string | Headers mapped by a guess below 0.7 confidence: confirm them. |
files[].createdAt | string (date-time) | |
createdAt | string (date-time) |
Remove a file from an import
DELETE /organizations/{organizationId}/imports/{importId}/files/{fileId}
DELETES the file (sheet) from the draft import; its stored upload goes when no sheet uses it. Returns the import.
| Permission | import.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 | imports_deleteFile (toolset settings) |
| Approval | Over MCP, this tool always waits for your approval in SKUFlow. See Approvals. |
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
importId | path | string | Yes | The import run (from POST /imports or GET /imports). |
fileId | path | string | Yes | A file of the import (one per CSV, or per sheet of a workbook). |
Example
curl -X DELETE "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/imports/{importId}/files/{fileId}" \
-H "Authorization: Bearer $SKUFLOW_API_KEY"Response
200: the answer's fields
| Field | Type | Description |
|---|---|---|
id | string | |
source | enum | One of DECONETWORK, SPREADSHEET. |
status | enum | One of DRAFT, QUEUED, RUNNING, COMPLETED, FAILED, UNDONE. |
lockHistory | boolean | |
progress | object | |
progress.phase | string | |
progress.done | number | |
progress.total | number | |
preview | object or null | The last dry run; null until previewed or after a change. |
preview.counts | object | Per entity: customers, properties, quotes, invoices, payments… |
preview.problems | array of object | |
preview.problems[].fileId | string or null | |
preview.problems[].fileName | string or null | |
preview.problems[].row | integer or null | 1-based line in the file (the header is line 1). |
preview.problems[].column | string or null | |
preview.problems[].severity | enum | Errors skip the row; warnings are only reported. One of error, warning. |
preview.problems[].message | string | |
preview.errors | integer | |
preview.warnings | integer | |
preview.samples | object | A few records as they will look. |
preview.openingBalances | object | |
preview.openingBalances.payments | integer | "Opening balance (imported)" payments so invoice balances match the export. |
preview.openingBalances.invoices | integer | Opening-balance invoices for account balances without open invoices. |
preview.openingBalances.amountCents | integer | |
preview.needsPaymentMethod | integer | Customers who paid by card on file or autopay: to re-collect. |
preview.files | integer | |
preview.rows | integer | |
previewedAt | string (date-time) or null | |
summary | object or null | What the applied run did, per entity. |
problems | array of object | |
problems[].fileId | string or null | |
problems[].fileName | string or null | |
problems[].row | integer or null | 1-based line in the file (the header is line 1). |
problems[].column | string or null | |
problems[].severity | enum | Errors skip the row; warnings are only reported. One of error, warning. |
problems[].message | string | |
queuedAt | string (date-time) or null | |
startedAt | string (date-time) or null | |
finishedAt | string (date-time) or null | |
error | string or null | |
undoUntil | string (date-time) or null | |
canUndo | boolean | |
undoneAt | string (date-time) or null | |
undoReport | object or null | |
files | array of object | |
files[].id | string | |
files[].uploadId | string | |
files[].fileName | string | |
files[].sheetName | string or null | |
files[].sizeBytes | integer | |
files[].status | enum | One of UPLOADING, READY, ERROR. |
files[].error | string or null | |
files[].dataset | enum or null | What the rows are; null = not recognised (skipped until set). One of pricebook, customers, contacts, properties, quotes, invoices, payments, notes. |
files[].detectedDataset | enum or null | One of pricebook, customers, contacts, properties, quotes, invoices, payments, notes. |
files[].detectionConfidence | number or null | |
files[].headers | array of string | |
files[].rowCount | integer | |
files[].sampleRows | array of array of string | |
files[].mapping | object | |
files[].needsReview | array of string | Headers mapped by a guess below 0.7 confidence: confirm them. |
files[].createdAt | string (date-time) | |
createdAt | string (date-time) |
AI column mapping
POST /organizations/{organizationId}/imports/{importId}/files/{fileId}/suggest-mapping
Columns the preset and the saved mapping do not know go to Claude (headers and up to three sample values each), which proposes a field, a custom field or skip with a confidence; anything below 0.7 is listed in needsReview. Never changes columns the owner set. Uses AI credits. Without AI configured the name heuristic answers (mode HEURISTIC). Returns the file.
| Permission | import.manage (Owner, Admin) |
| Risk | write, OAuth scope skuflow.write. Write: creates or changes records inside the business; nothing leaves it. |
| MCP tool | imports_suggestMapping (toolset settings) |
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
importId | path | string | Yes | The import run (from POST /imports or GET /imports). |
fileId | path | string | Yes | A file of the import (one per CSV, or per sheet of a workbook). |
Example
curl -X POST "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/imports/{importId}/files/{fileId}/suggest-mapping" \
-H "Authorization: Bearer $SKUFLOW_API_KEY"Response
200: the answer's fields
| Field | Type | Description |
|---|---|---|
mode | enum | One of AI, HEURISTIC. |
aiAvailable | boolean | |
file | object | |
file.id | string | |
file.uploadId | string | |
file.fileName | string | |
file.sheetName | string or null | |
file.sizeBytes | integer | |
file.status | enum | One of UPLOADING, READY, ERROR. |
file.error | string or null | |
file.dataset | enum or null | What the rows are; null = not recognised (skipped until set). One of pricebook, customers, contacts, properties, quotes, invoices, payments, notes. |
file.detectedDataset | enum or null | One of pricebook, customers, contacts, properties, quotes, invoices, payments, notes. |
file.detectionConfidence | number or null | |
file.headers | array of string | |
file.rowCount | integer | |
file.sampleRows | array of array of string | |
file.mapping | object | |
file.needsReview | array of string | Headers mapped by a guess below 0.7 confidence: confirm them. |
file.createdAt | string (date-time) |
Preview an import (dry run)
POST /organizations/{organizationId}/imports/{importId}/preview
The dry run: counts per entity (to create, to update, duplicates, kept because edited in SKUFlow), every problem with its file, row, column and severity, sample records, opening balances to write and customers who will need a card. Writes no records (only the preview on the import). Required before applying.
| Permission | import.manage (Owner, Admin) |
| Risk | write, OAuth scope skuflow.write. Write: creates or changes records inside the business; nothing leaves it. |
| MCP tool | imports_preview (toolset settings) |
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
importId | path | string | Yes | The import run (from POST /imports or GET /imports). |
Example
curl -X POST "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/imports/{importId}/preview" \
-H "Authorization: Bearer $SKUFLOW_API_KEY"Response
200: the answer's fields
| Field | Type | Description |
|---|---|---|
counts | object | Per entity: customers, properties, quotes, invoices, payments… |
problems | array of object | |
problems[].fileId | string or null | |
problems[].fileName | string or null | |
problems[].row | integer or null | 1-based line in the file (the header is line 1). |
problems[].column | string or null | |
problems[].severity | enum | Errors skip the row; warnings are only reported. One of error, warning. |
problems[].message | string | |
errors | integer | |
warnings | integer | |
samples | object | A few records as they will look. |
openingBalances | object | |
openingBalances.payments | integer | "Opening balance (imported)" payments so invoice balances match the export. |
openingBalances.invoices | integer | Opening-balance invoices for account balances without open invoices. |
openingBalances.amountCents | integer | |
needsPaymentMethod | integer | Customers who paid by card on file or autopay: to re-collect. |
files | integer | |
rows | integer |
Apply an import
POST /organizations/{organizationId}/imports/{importId}/apply
Writes customer and money records: runs the previewed import in the background in dependency order (pricebook → customers → contacts → properties → quotes → invoices → payments → notes). Sends nothing to customers: imported records emit no events and are held back from automations, reminders and dunning until cutover (POST /migration/cutover/release); webhooks get one import.completed. Invoices keep their numbers, issue dates, tax as charged and balances (an opening-balance payment where only a balance was exported); counters move past the highest imported number. Poll GET /imports/{importId}. Undo within 7 days.
| Permission | import.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 | imports_apply (toolset settings) |
| Approval | Over MCP, this tool asks for your OK first (in the AI app when it supports it, otherwise in SKUFlow). See Approvals. |
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
importId | path | string | Yes | The import run (from POST /imports or GET /imports). |
Example
curl -X POST "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/imports/{importId}/apply" \
-H "Authorization: Bearer $SKUFLOW_API_KEY"Response
200: the answer's fields
| Field | Type | Description |
|---|---|---|
id | string | |
source | enum | One of DECONETWORK, SPREADSHEET. |
status | enum | One of DRAFT, QUEUED, RUNNING, COMPLETED, FAILED, UNDONE. |
lockHistory | boolean | |
progress | object | |
progress.phase | string | |
progress.done | number | |
progress.total | number | |
preview | object or null | The last dry run; null until previewed or after a change. |
preview.counts | object | Per entity: customers, properties, quotes, invoices, payments… |
preview.problems | array of object | |
preview.problems[].fileId | string or null | |
preview.problems[].fileName | string or null | |
preview.problems[].row | integer or null | 1-based line in the file (the header is line 1). |
preview.problems[].column | string or null | |
preview.problems[].severity | enum | Errors skip the row; warnings are only reported. One of error, warning. |
preview.problems[].message | string | |
preview.errors | integer | |
preview.warnings | integer | |
preview.samples | object | A few records as they will look. |
preview.openingBalances | object | |
preview.openingBalances.payments | integer | "Opening balance (imported)" payments so invoice balances match the export. |
preview.openingBalances.invoices | integer | Opening-balance invoices for account balances without open invoices. |
preview.openingBalances.amountCents | integer | |
preview.needsPaymentMethod | integer | Customers who paid by card on file or autopay: to re-collect. |
preview.files | integer | |
preview.rows | integer | |
previewedAt | string (date-time) or null | |
summary | object or null | What the applied run did, per entity. |
problems | array of object | |
problems[].fileId | string or null | |
problems[].fileName | string or null | |
problems[].row | integer or null | 1-based line in the file (the header is line 1). |
problems[].column | string or null | |
problems[].severity | enum | Errors skip the row; warnings are only reported. One of error, warning. |
problems[].message | string | |
queuedAt | string (date-time) or null | |
startedAt | string (date-time) or null | |
finishedAt | string (date-time) or null | |
error | string or null | |
undoUntil | string (date-time) or null | |
canUndo | boolean | |
undoneAt | string (date-time) or null | |
undoReport | object or null | |
files | array of object | |
files[].id | string | |
files[].uploadId | string | |
files[].fileName | string | |
files[].sheetName | string or null | |
files[].sizeBytes | integer | |
files[].status | enum | One of UPLOADING, READY, ERROR. |
files[].error | string or null | |
files[].dataset | enum or null | What the rows are; null = not recognised (skipped until set). One of pricebook, customers, contacts, properties, quotes, invoices, payments, notes. |
files[].detectedDataset | enum or null | One of pricebook, customers, contacts, properties, quotes, invoices, payments, notes. |
files[].detectionConfidence | number or null | |
files[].headers | array of string | |
files[].rowCount | integer | |
files[].sampleRows | array of array of string | |
files[].mapping | object | |
files[].needsReview | array of string | Headers mapped by a guess below 0.7 confidence: confirm them. |
files[].createdAt | string (date-time) | |
createdAt | string (date-time) |
Undo an import
POST /organizations/{organizationId}/imports/{importId}/undo
DELETES what this import created (within 7 days of finishing), in reverse order. Records edited in SKUFlow since, or used by work added since (a new quote, invoice or payment), are kept and listed in undoReport. Records the import only updated stay as they are. Returns the import (status UNDONE).
| Permission | import.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 | imports_undo (toolset settings) |
| Approval | Over MCP, this tool asks for your OK first (in the AI app when it supports it, otherwise in SKUFlow). See Approvals. |
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
importId | path | string | Yes | The import run (from POST /imports or GET /imports). |
Example
curl -X POST "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/imports/{importId}/undo" \
-H "Authorization: Bearer $SKUFLOW_API_KEY"Response
200: the answer's fields
| Field | Type | Description |
|---|---|---|
id | string | |
source | enum | One of DECONETWORK, SPREADSHEET. |
status | enum | One of DRAFT, QUEUED, RUNNING, COMPLETED, FAILED, UNDONE. |
lockHistory | boolean | |
progress | object | |
progress.phase | string | |
progress.done | number | |
progress.total | number | |
preview | object or null | The last dry run; null until previewed or after a change. |
preview.counts | object | Per entity: customers, properties, quotes, invoices, payments… |
preview.problems | array of object | |
preview.problems[].fileId | string or null | |
preview.problems[].fileName | string or null | |
preview.problems[].row | integer or null | 1-based line in the file (the header is line 1). |
preview.problems[].column | string or null | |
preview.problems[].severity | enum | Errors skip the row; warnings are only reported. One of error, warning. |
preview.problems[].message | string | |
preview.errors | integer | |
preview.warnings | integer | |
preview.samples | object | A few records as they will look. |
preview.openingBalances | object | |
preview.openingBalances.payments | integer | "Opening balance (imported)" payments so invoice balances match the export. |
preview.openingBalances.invoices | integer | Opening-balance invoices for account balances without open invoices. |
preview.openingBalances.amountCents | integer | |
preview.needsPaymentMethod | integer | Customers who paid by card on file or autopay: to re-collect. |
preview.files | integer | |
preview.rows | integer | |
previewedAt | string (date-time) or null | |
summary | object or null | What the applied run did, per entity. |
problems | array of object | |
problems[].fileId | string or null | |
problems[].fileName | string or null | |
problems[].row | integer or null | 1-based line in the file (the header is line 1). |
problems[].column | string or null | |
problems[].severity | enum | Errors skip the row; warnings are only reported. One of error, warning. |
problems[].message | string | |
queuedAt | string (date-time) or null | |
startedAt | string (date-time) or null | |
finishedAt | string (date-time) or null | |
error | string or null | |
undoUntil | string (date-time) or null | |
canUndo | boolean | |
undoneAt | string (date-time) or null | |
undoReport | object or null | |
files | array of object | |
files[].id | string | |
files[].uploadId | string | |
files[].fileName | string | |
files[].sheetName | string or null | |
files[].sizeBytes | integer | |
files[].status | enum | One of UPLOADING, READY, ERROR. |
files[].error | string or null | |
files[].dataset | enum or null | What the rows are; null = not recognised (skipped until set). One of pricebook, customers, contacts, properties, quotes, invoices, payments, notes. |
files[].detectedDataset | enum or null | One of pricebook, customers, contacts, properties, quotes, invoices, payments, notes. |
files[].detectionConfidence | number or null | |
files[].headers | array of string | |
files[].rowCount | integer | |
files[].sampleRows | array of array of string | |
files[].mapping | object | |
files[].needsReview | array of string | Headers mapped by a guess below 0.7 confidence: confirm them. |
files[].createdAt | string (date-time) | |
createdAt | string (date-time) |
Cutover checklist
GET /organizations/{organizationId}/migration/cutover
What is left after importing: imported records still held back from automations (heldRecords), customers to ask for a card (customersNeedingCard), active automations, and the last import. Read-only.
| Permission | import.manage (Owner, Admin) |
| Risk | read, OAuth scope skuflow.read. Read: reads only. |
| MCP tool | imports_cutover (toolset settings) |
Example
curl "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/migration/cutover" \
-H "Authorization: Bearer $SKUFLOW_API_KEY"Response
200: the answer's fields
| Field | Type | Description |
|---|---|---|
lastImport | object or null | |
lastImport.id | string | |
lastImport.source | enum | One of DECONETWORK, SPREADSHEET. |
lastImport.finishedAt | string (date-time) or null | |
heldRecords | integer | |
customersNeedingCard | integer | |
automationsOn | integer |
Release imported records (cutover)
POST /organizations/{organizationId}/migration/cutover/release
Customer-visible from now on: imported customers, quotes and invoices join automations, reminders and dunning. Do it once the old system has stopped sending (cutover day). Sends nothing by itself. Returns how many records were released.
| Permission | import.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 | imports_release (toolset settings) |
| Approval | Over MCP, this tool asks for your OK first (in the AI app when it supports it, otherwise in SKUFlow). See Approvals. |
Example
curl -X POST "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/migration/cutover/release" \
-H "Authorization: Bearer $SKUFLOW_API_KEY"Response
200: the answer's fields
| Field | Type | Description |
|---|---|---|
released | integer |
Customers to ask for a card
GET /organizations/{organizationId}/migration/needs-card
Customers who paid by card on file or autopay in the old system (needsPaymentMethod): saved cards are not copied, so they are sent the update-card link. The flag clears when they save a card. Read-only.
| Permission | import.manage (Owner, Admin) |
| Risk | read, OAuth scope skuflow.read. Read: reads only. |
| MCP tool | imports_needsCard (toolset settings) |
Example
curl "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/migration/needs-card" \
-H "Authorization: Bearer $SKUFLOW_API_KEY"Response
200: the answer's fields
| Field | Type | Description |
|---|---|---|
total | integer | |
customers | array of object | |
customers[].id | string | |
customers[].name | string | |
customers[].email | string or null | |
customers[].phone | string or null |
Send update-card links
POST /organizations/{organizationId}/migration/update-card-links
Sends to customers: emails or texts each customer flagged needsPaymentMethod (or only customerIds) a link to their portal to add a card for automatic payments (Stripe Checkout in setup mode; nothing is charged). Consent, quiet hours and the message log apply; batchKey makes a retry send nothing twice. Needs online payments (Settings → Payments): 409 otherwise.
| Permission | import.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 | imports_sendUpdateCardLinks (toolset settings) |
| Approval | Over MCP, this tool always waits for your approval in SKUFlow. See Approvals. |
Request body
| Field | Type | Required | Description |
|---|---|---|---|
channel | enum | No | One of EMAIL, SMS, EMAIL_OR_SMS. Default EMAIL_OR_SMS. |
customerIds | array of string | No | Only these (from GET /migration/needs-card). Up to 2000 items. |
batchKey | string | No | Reuse to retry without sending twice. Up to 100 characters. |
Example
curl -X POST "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/migration/update-card-links" \
-H "Authorization: Bearer $SKUFLOW_API_KEY" \
-H "Content-Type: application/json" \
-d '{"channel":"EMAIL_OR_SMS","customerIds":["customer_id"],"batchKey":"string"}'Response
200: the answer's fields
| Field | Type | Description |
|---|---|---|
batchKey | string | |
sent | integer | |
skipped | integer | |
results | array of object | |
results[].customerId | string | |
results[].name | string | |
results[].outcome | enum | One of SENT, QUEUED, SKIPPED. |
results[].reason | string or null | |
results[].channel | enum or null | One of EMAIL, SMS. |
Business units API
REST endpoints for business units in SKUFlow: 10 operations with parameters, request and response fields, permissions and curl examples.
Integrations API
REST endpoints for integrations in SKUFlow: 18 operations with parameters, request and response fields, permissions and curl examples.