Generate founder or staff campaign images, upscale and polish them, then create a short business video.
Local Business Campaign
Use this workflow for a founder, staff member, or owner. The final assets can work as local ads, landing page banners, posters, or short social clips.
Before you start
Complete Setup and Training first. These snippets assume
modelId or model_id, triggerImageGeneration, triggerImageUpscaling,
triggerVideoGeneration, waitForJob, and firstImage are already available.
Workflow
- Generate a campaign portrait with
POST /images/generation. - Upscale the selected portrait with
POST /images/upscaling. - Create a wider campaign still with
POST /images/generation. - Animate the campaign still with
POST /videos/generation.
Generate the campaign portrait
Start with the trained model so the person stays recognizable.
const businessImageJobId = await triggerImageGeneration({
modelID: modelId,
prompt:
'friendly cafe owner portrait in front of the counter, warm morning light, inviting local business campaign image',
width: 1024,
height: 1024,
numImages: 2,
enhanceFace: true,
})
const businessImage = firstImage(await waitForJob(businessImageJobId), 'Business portrait')business_image_job_id = trigger_image_generation(
{
"modelID": model_id,
"prompt": "friendly cafe owner portrait in front of the counter, warm morning light, inviting local business campaign image",
"width": 1024,
"height": 1024,
"numImages": 2,
"enhanceFace": True,
}
)
business_image = first_image(wait_for_job(business_image_job_id), "Business portrait")Upscale the campaign portrait
Upscale the best portrait before asking a public image model to build the wider campaign image around it. This keeps the identity reference clean for later steps.
const businessUpscaleJobId = await triggerImageUpscaling({
imageID: businessImage.id,
})
const businessUpscaledImage = firstImage(await waitForJob(businessUpscaleJobId), 'Business upscale')business_upscale_job_id = trigger_image_upscaling(
{
"imageID": business_image["id"],
}
)
business_upscaled_image = first_image(
wait_for_job(business_upscale_job_id),
"Business upscale",
)Create a polished campaign still
Use a public image model to add the business context around the person. The upscaled portrait is the reference image for that generation request.
const businessCampaignJobId = await triggerImageGeneration({
modelID: 'gpt-image-2',
prompt:
'local cafe promotional image, owner standing beside fresh pastries and coffee cups, warm neighborhood atmosphere',
aspectRatio: '16:9',
numImages: 1,
referenceImageURLs: [businessUpscaledImage.url],
options: {
openai: {
imageSize: '1K',
outputFormat: 'jpeg',
quality: 'high',
},
},
})
const businessCampaignImage = firstImage(
await waitForJob(businessCampaignJobId),
'Business campaign image'
)business_campaign_job_id = trigger_image_generation(
{
"modelID": "gpt-image-2",
"prompt": "local cafe promotional image, owner standing beside fresh pastries and coffee cups, warm neighborhood atmosphere",
"aspectRatio": "16:9",
"numImages": 1,
"referenceImageURLs": [business_upscaled_image["url"]],
"options": {
"openai": {
"imageSize": "1K",
"outputFormat": "jpeg",
"quality": "high",
},
},
}
)
business_campaign_image = first_image(
wait_for_job(business_campaign_job_id),
"Business campaign image",
)Generate a short business video
Use the campaign still as the first frame for a social or homepage clip.
const businessVideoJobId = await triggerVideoGeneration({
modelID: 'seedance-2.0',
prompt:
'welcoming local business video, owner opens the cafe door, gestures toward the counter, warm community feel',
numVideos: 1,
referenceImages: [
{
url: businessCampaignImage.url,
role: 'first_frame',
},
],
options: {
seedance: {
duration: 6,
ratio: '16:9',
resolution: '1080p',
generateAudio: false,
},
},
})
const businessVideoJob = await waitForJob(businessVideoJobId, 8000)
const businessVideo = businessVideoJob.videos?.[0]business_video_job_id = trigger_video_generation(
{
"modelID": "seedance-2.0",
"prompt": "welcoming local business video, owner opens the cafe door, gestures toward the counter, warm community feel",
"numVideos": 1,
"referenceImages": [
{
"url": business_campaign_image["url"],
"role": "first_frame",
},
],
"options": {
"seedance": {
"duration": 6,
"ratio": "16:9",
"resolution": "1080p",
"generateAudio": False,
},
},
}
)
business_video_job = wait_for_job(business_video_job_id, interval_seconds=8)
business_video = business_video_job.get("videos", [])[0]Production notes
- Keep the location and business category in every prompt so the final set feels coherent.
- Use the same
modelIdacross portrait, campaign still, and video to preserve identity. - Store the final campaign image URL separately if you plan to reuse it across multiple video prompts.