Use case · Social commerce

Caption TikTok Shop videos for every market — without colliding with the feed

9:16 safe-zone-aware captions. Translated per market. Backend API

Vertical shop videos lose the message when captions collide with the cart button, the price tag, or the for-you UI. ZapCap is the caption-rendering and translation API that places safe-zone-aware captions and localizes them per market, so cross-border product clips read clearly on every feed.

Safe-zone-aware placement · translateTo · webhook delivery
The problem

Vertical video is unforgiving, and you sell across borders

On TikTok Shop the frame is the constraint. A 9:16 product clip has a cart button, a price tag, and feed chrome fighting your caption for the same pixels — and the buyer reads it in a different language. Place the caption wrong and it sits under the cart; translate it wrong and the hook dies in the new market. ZapCap fixes both in one render call, per market.

  • UI collision — captions buried under cart, price, and feed chrome.
  • Safe-zone discipline — top and bottom thirds change meaning per platform.
  • Cross-border copy — the hook must land in the buyer's language, not a literal gloss.
  • Vertical re-renders — the same clip re-cut per market by hand.
  • CJK / Thai layout — wrapping and line-break rules differ by script.
  • Catalog velocity — new products daily, each needing localized cuts now.
Reference architecture

Where ZapCap sits in your shop pipeline

Run ZapCap behind your seller tooling as the caption layer for finished 9:16 product clips. Your backend sends one vertical source clip, requests a safe-zone-friendly caption preset per market, and files each localized cut back to the storefront that needs it.

Your shop assets
9:16 product clip
Cross-border markets
Source clip in your CDN
Your backend
Localization job runner
Holds ZAPCAP_API_KEY (server-only)
/webhooks/zapcap handler
ZapCap
POST /videos
Task per market · translateTo
Vertical renderUrl
Placement matters most in 9:16: choose a template whose caption position keeps clear of the feed UI, and reuse it across markets so every cut stays in the safe zone.
Backend integration

One vertical clip, a localized cut per market

Upload the 9:16 source once, then fire a render task per market with translateTo and a safe-zone-friendly preset. Each localized cut arrives via webhook, ready to upload per storefront.

WEBHOOK PAYLOAD
{
  "eventId":   "evt_8kQ2...",
  "taskId":    "tsk_2hP4...",
  "event":     "render.completed",
  "renderUrl": "https://cdn.zapcap.../shop-th.mp4"
}
  • Map taskId → market / storefront when you create the task.
  • Verify the x-signature header before fetching renderUrl.
  • Dedupe webhook deliveries on eventId.
1// Localize a vertical shop clip across markets
2const KEY = process.env.ZAPCAP_KEY;
3const ZAP = (path, body) =>
4 fetch(`https://api.zapcap.ai${path}`, {
5 method: 'POST',
6 headers: { 'x-api-key': KEY, 'Content-Type': 'application/json' },
7 body: JSON.stringify(body),
8 }).then(r => r.json());
9 
10const SAFE_PRESET = "<TEMPLATE_UUID>"; // from GET /templates — caption position clear of feed UI
11const MARKETS = ['th', 'id', 'vi', 'zh']; // language codes, e.g. zh (not zh-CN)
12 
13export async function localizeShopClip(clipUrl, productTerms) {
14 const video = await ZAP('/videos/url', { url: clipUrl });
15 
16 for (const lang of MARKETS) {
17 const task = await ZAP(`/videos/${video.id}/task`, {
18 templateId: SAFE_PRESET,
19 translateTo: lang,
20 dictionary: productTerms, // product + brand names as transcription hints
21 // keep words tight so captions stay inside the 9:16 safe zone
22 renderOptions: { subsOptions: { displayWords: 3 } },
23 notification: {
24 type: 'webhook',
25 notificationsFor: ['render'],
26 recipient: 'https://shop.example.com/hooks/zapcap',
27 },
28 });
29 await db.shopCuts.create({ id: task.taskId, market: lang, status: 'processing' });
30 }
31}
State machine

Lifecycle of a localized shop cut

Each market is its own task. Track them so sellers can upload each localized cut to the matching storefront the moment it lands.

pending
transcribing
transcriptionCompleted
rendering
completed
In your seller tool
Show a per-storefront grid — "TH ready, ID rendering, VI queued" — so each cut goes live as it completes.
On webhook
File the renderUrl under the right market and queue it for upload to that storefront.
On failure
Re-run only the failed market; the rest of the localized set is unaffected.
Launch checklist

Before you go cross-border

A short list to keep vertical, localized cuts on-brand and inside the safe zone. Placement, terminology, and delivery in one place.

  • Safe-zone caption preset Pick a templateId whose caption position keeps clear of cart, price, and feed UI.
  • Tight word count per cue Use subsOptions.displayWords so captions never overflow the 9:16 frame.
  • Product terms in your dictionary Feed product and brand names so transcription gets them right before translation.
  • Market list as code Drive the cross-border fan-out from one source of truth.
  • Per-storefront delivery convention File each renderUrl by market so the right cut reaches the right shop.
  • Webhook signature verified Check x-signature on every payload; dedupe on eventId.
  • Credit-balance check before a fan-out Cross-border means many renders — confirm balance before queueing.
Build vs buy

The vertical localization stack, honestly

Build it yourself

In-house shop-video pipeline

  • 1ASR + translation wiring — vendors, retries, terminology control.
  • 2Safe-zone layout logic — keep captions clear of 9:16 feed UI.
  • 3Per-cue word fitting — wrapping for CJK / Thai inside a tall frame.
  • 4Render workers — ffmpeg / libass, autoscaling for catalog spikes.
  • 5Per-market tracking — one clip, many localized cuts.
  • 6Output storage — pre-signed URLs, expiry, cleanup.
  • 7Billing meter — per-minute counters across the catalog.
Use ZapCap

Localized vertical captions as a primitive

  • 1POST /videos — upload the 9:16 clip once.
  • 2translateTo per task — a safe-zone cut per market.
  • 3Webhook handler — verify, file by market, upload.
When ZapCap isn't the right answer: if you need to assemble shop videos from product feeds or templated scenes, a broader video automation API (Creatomate, Shotstack, JSON2Video) likely fits better. See our honest alternatives comparisons.
Customer · Anonymized

A cross-border social commerce seller wired the ZapCap API into their seller tooling and localizes every vertical shop clip per market with captions that stay clear of the feed UI

Each new product clip is uploaded once and fanned out into safe-zone-aware, localized cuts per storefront through a webhook handler — instead of an editor manually re-placing captions per market.

9:16
Safe-zone-aware placement
per market
One localized cut each
~0 lines
Of ffmpeg / render infra
per-minute
Billing passes through cleanly

For social commerce sellers

Pick a templateId from GET /templates whose caption position sits in the safe zone for vertical feeds, and reuse it across markets. Keeping a tight word count per cue with renderOptions.subsOptions.displayWords also stops captions overflowing the 9:16 frame where the platform UI lives.

Caption shop videos for every market

Backend-only API, webhook-native, from $0.10/min base usage pricing. Safe-zone-aware captions, localized per market, on every feed.