This guide covers the full technical integration for external services connecting to the Creative Force Cloud Automation API. It picks up where your Creative Force studio contact leaves off– once you have your credentials, everything here is yours to implement. If you are a studio admin setting up a Custom Cloud Automation Connector, see the Custom Cloud Automation Connector overview instead.
Getting Started
Prerequisites
Before you begin, your Creative Force studio contact will provide three values. Your application must store all three and allow each customer to configure their own set.
Client ID | Used to identify your application when requesting an access token. |
Client Secret
| Used alongside the Client ID in the OAuth token request. |
Webhook Secret Key
| Used to verify that incoming webhook requests originated from Creative Force, not a third party. |
The API base URL for all endpoints is https://gateway.creativeforce.io/v1. Full API reference documentation is available at developers.creativeforce.io.
Authorization
Client Credentials | Machine-to-machine (M2M) authorization. No user interaction required– the right fit for webhook sub-function integrations. |
Authorization Code | User-to-application authorization. More granular user control, but a heavier implementation. Only needed when end-users must authorize individually. |
See the API documentation for detailed setup: Getting started with Client Credentials Flow · Authorization Code Grant Flow.
Rate Limiting
The API enforces a limit of 20 requests per second per IP address.
Time Frame | Requests Allowed |
1 second | 20 |
1 minute | 1,200 |
1 hour | 72,000 |
1 day | 1,728,000 |
⚠️ Implement Request Queue: Re-queuing 429 responses is not a safe strategy under burst conditions; it will compound the problem. A steady flow through a queue significantly increases throughput. The API documentation intro links to resources on rate limit handling.
Where Cloud Automation Sits in the Workflow
A Creative Force admin can place a Cloud Automation step at different points in a studio workflow. The two most common positions are:
Mode | Position in Workflow | Use Cases |
Content Generation | Between Capture and Final Selection | Mannequin-to-on-model, still image to AI video, flat-to-ghost-mannequin |
Post Production | After Final Selection | AI retouching, background removal, color correction, format conversion |
Your integration does not need to detect which mode a workflow is in. Everything required to process and submit work is described per item in taskProcessExpectedOutputs, and returned by Get Process Detail.
Read each item's own flags rather than inferring behavior from the workflow configuration.
Integration Flow
Each task process follows the same 8-step cycle, from receiving a webhook event to submitting output back to Creative Force.
1 | Listen for the Webhook Event | Receive a |
2 | Get Process Detail | Retrieve input assets, expected outputs, and style guide context for the task process. |
3 | Download Input Assets and Color References | Resolve asset and file IDs to pre-signed S3 download URLs, then download the files. |
4 | Get Additional Context (Optional) | Fetch product, job, outfit, or annotation data if your service needs the extra context. |
5 | Process the Assets | Run your external processing — AI generation, retouching, compositing, or conversion. |
6 | Update Process Status if Failed (If Applicable) | Signal failures back to Creative Force so tasks don't stall in progress. |
7 | Upload Output Files to Creative Force Storage | Get pre-signed S3 URLs, then PUT output files directly to Amazon S3. |
8 | Submit Output | Register uploaded assets against expected outputs. Creative Force advances the task when complete. |
1. Listen for Webhook Event
Configure your endpoint to receive ReadyToWork events. Each Cloud Automation level emits the same event shape– filter by StepId to handle only the level(s) your integration is responsible for.
StepId Reference
Step Name | StepID | Notes |
Cloud Automation | 25 | Default step |
Cloud Automation (L1) | 26 | Level 1 |
Cloud Automation (L2) | 27 | Level 2 |
Cloud Automation (L3) | 28 | Level 3 |
Cloud Automation (L4) | 29 | Level 4 |
Cloud Automation (L5) | 40 | Level 5 |
Webhook Payload Example
Capture TaskProcessId immediately– it is required on every API call for the rest of this cycle.
JSON | ReadyToWork Event
{
"Action": "ReadyToWork",
"TaskId": "032b99a6-2de5-4545-b87a-336d4f7e861e",
"TaskProcessId": "ee55d091-e7ca-4c5e-a38d-2e1ac7706a88",
"SubfunctionId": 54,
"SubFunctionName": "Mannequin to On Model",
"JobId": "d84eef10-c8a6-437a-9f95-0b58d2a3cb38",
"JobCode": "Summer 2026",
"ClientId": "2c856b2f-aded-4609-bf67-27009603b2b9",
"ClientName": "Acme Studio",
"ProductId": "7a782d57-b0bf-4743-8f02-2b1a1e229869",
"ProductCode": "AW2130146",
"StepId": "25",
"StepName": "Cloud Automation",
"StepStatusId": "2000",
"StepStatusName": "Ready To Work",
"ShootingTypeId": "1",
"ShootingTypeName": "AI On Model",
"StyleGuideId": "2376b9cb-67db-490f-a5e8-89811ed6b087",
"StyleGuideName": "Apparel: Pants and Skirts"
}A rework event looks identical to a first pass ReadyToWork event — nothing in the webhook payload flags it as a rework. The process detail in Step 2 reveals the state via outputAssets and isRejected flags.
2. Get Process Detail
GET |
|
Returns the full context needed to process the task. The response has four key components:
Overview context: task, product, outfit, job, style guide, client, and step identifiers
Input assets: images/videos provided to this process, each with position and attribute
Output assets: assets produced by previous runs. Empty on a fresh run; populated on reject/rework cycles with
isRejectedflagsExpected outputs: one item per drop box to fill, with all flags and quantity rules your integration needs
Key Top-Level Fields
Field | Type | Description |
| Guid | Use on all subsequent calls in this cycle. |
| Guid | Parent task identifier. Used for annotation fetches (Step 4). |
| Guid | Populated when the product belongs to an outfit. Use to fetch styling assets for secondary products. |
| Guid | Owning workspace– required when requesting pre-signed upload URLs (Step 7a). |
| List<Guid> | File IDs for color reference images. Resolve via |
| List | Assets provided to this process as input. |
| List | Assets from previous runs. Check |
| List | One item per drop box to fill. These drive how you structure your submission in Step 8. |
Working with Expected Outputs
Each item in taskProcessExpectedOutputs represents one slot to fill. Read and act on each item's own flags — never infer behavior from the workflow configuration.
Field | Type | Description |
| string | Opaque slot identifier — treat it as a token. Use this exact value when submitting output in Step 8. |
| bool |
|
| bool |
|
| int / int? | Min/max count for main + inclip + resource assets combined. |
| bool | Whether alternate images are accepted for this slot. |
| bool | Whether alternates are required. |
| int | Min/max alternate count. |
| bool | On a rework cycle, |
| List<Guid> | Previous output asset IDs for this slot — needed when resubmitting on a rework cycle. |
| enum | Expected media type:
|
Every mappingKeyId must appear in your Submit Output call– either with assets or with an empty assets array for optional slots you are not filling.
Omitting a mappingKeyId returns ErrorCode-1554: SubmitMappingKeyMismatch.
Enum Reference
EnumAssetAttribute |
|
Value | Name |
0 | Normal |
1 | Inclip |
2 | Resource |
4 | Alternative |
EnumAssetContentType |
|
Value | Name |
1 | Photo |
2 | Video |
4 | Both |
3. Download Input Assets & Color References
Use the IDs from Get Process Detail to fetch download URLs in bulk, then download the files from the returned pre-signed S3 URLs.
POST |
|
Pass an array of assetId values from inputAssets. Returns each asset with its filename and a fileUrl pre-signed download URL.
POST |
|
Pass an array of fileId values from colorReferenceFiles (and any other file references, such as styling assets resolved in Step 4). Accepts up to 100 file IDs per request. Returns each file with its filename, URL, size, and MD5.
4. Get Additional Context
None of these calls are required to complete a task process. Use them only when your service needs the additional context.
Product & Job
GET |
|
GET |
|
Annotations
(Most useful on rework cycles)
Returns reviewer annotations per asset– short text comments and optional markup images drawn over the asset in color. Use this to regenerate against specific reviewer feedback rather than guessing what to change.
GET |
|
This endpoint is keyed by taskId, not taskProcessId. Each annotation can carry a markingFileId– resolve it via bulk-get-files to download the visual markup image.
Outfit Context
(when outfitId is populated)
An outfit groups a primary product with one or more secondary styling products– for example, a shirt (primary) paired with trousers and shoes (secondary). When your service needs to generate a complete styled look, use these endpoints to enumerate outfit products and retrieve their reference imagery.
GET |
|
Lists all products in the outfit (max 100). The roleId field distinguishes the primary product (1) from secondary styling products (2+).
POST |
|
Returns the best available styling asset per (productId, positionTagId) for a list of products. Resolution follows shooting-type priority: Mannequin → Flat → non-OnModel → OnModel. Pass only the secondary products– the primary product's assets are already in inputAssets. The response returns fileId references; resolve them with bulk-get-files.
5. Process the Assets
Run your external processing on the downloaded input assets– AI-generated model replacement, ghost-mannequin compositing, retouching, background removal, color correction, format conversion, or whatever your service is responsible for. This is the work the integration exists to perform.
6. Update Process Status if Failed
If your service cannot complete processing– due to an upstream failure, invalid input, or an unrecoverable error– you must signal this back to Creative Force. Without this call, the task will sit indefinitely with a status of "In Progress" on the studio side.
PUT |
|
See the API documentation for request body details and status values.
7. Upload Output Files to Creative Force Storage
Output files are uploaded to Amazon S3 using pre-signed URLs. This is a two-step process: first obtain the URLs, then upload directly to S3.
7a. Get Pre-signed URLs
POST |
|
Call this once per batch to mint pre-signed S3 PUT URLs for all output files in a single request. Assign a localId to each file so you can map the returned tempAssetId values back to your files.
{
"clientId": "fe2bcb16-428f-4e21-9d8b-59ab0790eecd", //fromGetProcessDetail
"physicalFileTypeId": 2,
"files": [
{ "fileName": "output_front.jpg", "localId": "your-local-id-1", "fileLength": 2011193 },
{ "fileName": "output_back.jpg", "localId": "your-local-id-2", "fileLength": 1982531 }
]
}The response has three top-level fields:
| an array of |
| one entry per requested file, each containing |
| any files that failed to receive a URL (for example, invalid |
Retain each file's tempAssetId (matched by localId) — required in Step 8.
tempAssetId values are single-use. If the same output file needs to be submitted to two different drop boxes, upload it twice and request a separate tempAssetId for each upload.
7b. Upload Files to S3
For each file, PUT the raw binary file contents to its presignedUrl. Set the following headers:
Every entry from the top-level
headersarray from 7a (S3 encryption headers– same for all files in the batch)Content-Typeset to thecontentTypevalue returned for that specific file
HTTP — S3 PUT request
PUT [presignedUrl]
x-amz-server-side-encryption: aws:kms
x-amz-server-side-encryption-aws-kms-key-id: arn:aws:kms:{region}:{account}:key/{key-id}
Content-Type: image/jpeg
[binary file contents]
Do not add any other headers or query parameters — all required query parameters are already baked into the pre-signed URL. A successful upload returns 200 OK with no body.
8. Submit Output
POST |
|
Assets are grouped by mappingKeyId, taken directly from taskProcessExpectedOutputs. Every mappingKeyId from Get Process Detail must appear, either with assets or with an empty assets array.
outputResultTypeId Values
Value | Name | When to Use | What |
1 | ProcessNewAsset | A new asset generated in this run — the common case. | The |
2 | KeepOldAsset | Rework cycle only — the asset was not rejected and should be retained as-is. | The previously submitted |
3 | RedoAsset | Rework cycle only — replaces a rejected asset. Set | The new |
Request Body Example
This example shows all three result types in a single submission. 1_Front receives a new main shot and a new alternate. 2_Back is a rework– the rejected output is replaced. 3_Detail is an optional slot with nothing to submit this run.
JSON | Submit Output Request
{
"submitAssets": [
{
"mappingKeyId": "1_Front",
"assets": [
{
// New main shot — assetId is the tempAssetId from Step 7a
"oldOutputAssetId": null,
"assetId": "4765ad06-6815-4980-a129-56520c0369b5",
"outputResultTypeId": 1,
"assetAttributeId": 0, // Normal
"resourceIds": null,
"specId": null
},
{
// Alternate shot — assetAttributeId 4 = Alternative
"oldOutputAssetId": null,
"assetId": "f641bfa0-e283-41d3-905a-568262e203ac",
"outputResultTypeId": 1,
"assetAttributeId": 4, // Alternative
"resourceIds": null,
"specId": null
}
]
},
{
"mappingKeyId": "2_Back",
"assets": [
{
// Rework — replace a rejected asset
"oldOutputAssetId": "f29c1aa1-7a2d-40d8-b47f-9f72b36ae081",
"assetId": "821ab78a-1667-4f86-9034-ccd685e6549c",
"outputResultTypeId": 3, // RedoAsset
"assetAttributeId": 0,
"resourceIds": null,
"specId": null
}
]
},
{
// Optional slot — nothing to submit this run
"mappingKeyId": "3_Detail",
"assets": []
}
]
}
Response
The response returns the final assetId and fileId for each submitted asset. Your integration should store these and map them back to your internal output records.
JSON | Response
{
"assets": [
{ "assetId": "4765ad06-6815-4980-a129-56520c0369b5", "fileId": "3062ebd5-a4e8-4b7d-9e2b-02863ea13f34" },
{ "assetId": "f641bfa0-e283-41d3-905a-568262e203ac", "fileId": "3d40e0dc-b66c-4838-950e-71dd37811dd9" }
]
}Once Submit Output completes successfully, Creative Force advances the task process to the next workflow step. No further API calls are needed from the external side for that task.
Rework Cycle
When a reviewer in Creative Force rejects outputs, Creative Force sends a fresh ReadyToWork webhook for the same task process. On the rework pass:
Check
outputAssetsin the Get Process Detail response — assets withisRejected: trueneed to be regenerated.
For each drop box (
taskProcessExpectedOutputsitem), checkisRejectedandoutputAssetIdsto determine which prior outputs to keep or replace.
When a drop box is partially rejected (some assets rejected, others not), re-submit the entire drop box. Use
KeepOldAssetfor non-rejected assets andRedoAssetfor rejected ones.
Fetch annotations via Step 4 to give your service the reviewer's specific feedback before regenerating.
