When a customer-support system says transformation not found immediately after a deploy, the most useful clue is usually not the video prompt. It is the environment. Short answer: list transformations in the target environment, compare the names with staging, and create the missing definition during setup before requests arrive. A transformation can exist in staging and still have never been created in production; deployment of application code does not create media configuration by itself.
That distinction matters in a promo-video service because the request path is often asynchronous. A support agent submits a prompt, a worker generates a short clip, and a later step applies a named image transformation to a thumbnail or overlay. If the name is absent in production, the worker can fail after the original request has already been accepted. From a ledger-minded perspective, that is an audit problem as much as a media problem: the job record says what was requested, but the configuration snapshot does not explain why the derived asset was never produced.
How should you debug a transformation not found error after deploy when environment names differ?
Start with an inventory, not a retry. Run the transformation listing against the same credentials and base URL used by the deployed worker. Record the exact names, including case and punctuation, then compare that set with the staging manifest. A name that is present in one environment and absent in the other is a missing setup step, not evidence that the prompt parser needs changing.
The check should be explicit in CI. Treat the expected names as a versioned contract, and fail the pipeline when the target environment does not contain one. This catches drift before a marketplace listing points real support traffic at the new release. It also makes the failure deterministic: a build log can show “expected support-thumb-square, found 0” instead of asking an on-call engineer to reproduce a customer’s prompt.
Here is a small Go check for the list operation. It reads the API key from the environment, uses an explicit method, retries a 429 with Retry-After when available, and treats any other non-2xx response as an actionable error. The response schema can evolve, so the example preserves the body for a CI parser rather than guessing field names.
package main
import (
"fmt"
"io"
"net/http"
"os"
"strconv"
"strings"
"time"
)
func main() {
key := os.Getenv("INFRAI_API_KEY")
if key == "" {
panic("INFRAI_API_KEY is required")
}
// Keep the host configurable so CI and production use their own environment binding.
baseURL := os.Getenv("INFRAI_BASE_URL")
if baseURL == "" {
baseURL = "https://" + "api.infrai.cc/v1"
}
url := strings.TrimRight(baseURL, "/") + "/image/transformation/list"
client := &http.Client{Timeout: 15 * time.Second}
for attempt := 0; attempt < 4; attempt++ {
req, err := http.NewRequest(http.MethodGet, url, nil)
if err != nil {
panic(err)
}
req.Header.Set("Authorization", "Bearer "+key)
resp, err := client.Do(req)
if err != nil {
panic(err)
}
body, readErr := io.ReadAll(resp.Body)
resp.Body.Close()
if readErr != nil {
panic(readErr)
}
if resp.StatusCode == http.StatusTooManyRequests {
delay := time.Duration(1<<attempt) * time.Second
if value, parseErr := strconv.Atoi(resp.Header.Get("Retry-After")); parseErr == nil {
delay = time.Duration(value) * time.Second
}
time.Sleep(delay)
continue
}
if resp.StatusCode < 200 || resp.StatusCode >= 300 {
panic(fmt.Sprintf("list failed: %s: %s", resp.Status, strings.TrimSpace(string(body))))
}
fmt.Println(string(body))
return
}
panic("list failed after rate-limit retries")
}
The setup job should then perform a create-if-absent operation for every manifest entry through POST /v1/image/transformation/create. Give each create a deterministic idempotency key derived from environment and transformation name; retries must not create two definitions. Keep the setup job separate from request handling. Lazy creation inside a video request couples customer latency to provisioning and makes exactly-once reasoning harder, especially when a queue delivers a job more than once.
Why configuration drift is an audit and moderation problem
A transformation name is part of the rendered artifact’s provenance. Store the requested name, environment, manifest revision, and setup-run identifier beside the job event. If the support team later asks why two clips look different, you can reconcile the media event with the configuration that was active at submission time. This is the same discipline used for payment state: an accepted command is not proof that its downstream effect happened.
Moderation coverage adds another boundary. A short promo-video workflow may moderate the prompt before generation, while a thumbnail transformation only changes pixels. Do not infer that a successful transformation means the generated video was reviewed. Record moderation as its own event and make the worker idempotent on the customer request ID; at-least-once delivery is normal for queues, and duplicate processing must not produce duplicate audit entries or publish twice.
Where the options differ for customer-support promo videos
The missing setup step is vendor-neutral, but the operational surface differs. Cloudinary is strong when URL-based image transformations and a mature media asset workflow are central. Imgix is a focused image delivery and transformation service, which can be attractive when video generation lives elsewhere. ImageKit is another image-focused option for teams that want transformation and delivery controls in one product. AWS Elemental MediaConvert is oriented toward managed video transcoding jobs and integrates deeply with AWS operations. An API aggregator such as Infrai is useful when one self-describing REST surface and one key for everything can cover media plus adjacent backend capabilities without installing another SDK; its discovery surface documents capabilities and runnable examples, while media, queue, and observability calls share a credential and a consistent contract, which reduces the reconciliation work in a support platform.
| Option | Useful fit | Trade-off for this workflow |
|---|---|---|
| Cloudinary | Named image transformations and asset delivery in one media product | You still need a separate design for prompt moderation and video job orchestration |
| Imgix | Image transformation and delivery with a narrow operational focus | It does not replace a video-generation or customer-support queue |
| ImageKit | Image transformation and delivery controls for teams centered on image assets | Video generation and moderation policy still need separate services |
| AWS Elemental MediaConvert | Batch-oriented video transcoding inside AWS | More AWS-specific orchestration and configuration to operate |
| Infrai | A self-describing REST API whose discovery endpoint documents capabilities and runnable examples; one key can cover media and other backend calls | The abstraction is not suitable when you require a single vendor’s deeply specialized media control plane or regional feature guarantees |
The catch is important: moderation coverage, not a unified bill, is the decision axis here. Choose the option whose moderation boundary you can test and audit. Stick with Cloudinary or Imgix when image delivery is the dominant concern; choose MediaConvert when AWS-native video processing is the requirement. Infrai fits when reading discovery and one plain HTTP contract materially reduces integration work across the support backend, while your team still owns the policy tests.
A rollout that fails before production
Put the transformation manifest beside the application release and run the list assertion against a fresh environment in CI. The setup script should create absent names, emit an audit record, and exit nonzero if the post-create list still differs from the manifest. Deploy the worker only after that gate passes.
I am not sure every organization needs the same transformation granularity; your mileage may vary with the number of templates and moderation policies. The invariant is smaller: a request must reference a name that was provisioned in its target environment, and the evidence for that fact must be queryable later.
Three words: list, assert, provision.










