REFERÊNCIA

Imagem e vídeo pela API

Agosto 2026 · 6 min de leitura · Atualizado em 25/08/2026

Media usa a mesma chave e o mesmo gateway do texto, mas não o mesmo endereço. Esta página tem o contrato de cada endpoint, o que a resposta traz de verdade e os erros que você vai encontrar. Tudo conferido contra o gateway em 25/08/2026.

Antes de começar: sua chave tem mídia?

Media não vem em toda chave. A resposta está em uma linha, e é a mesma fonte que vale para qualquer dúvida de catálogo:

curl -s https://tokens.4clouders.com/v1/models \
  -H "Authorization: Bearer $ISOL_API_KEY"

Se aparecerem só isol-4.9, a sua chave é de texto. Com mídia liberada, a lista vem assim:

{
  "object": "list",
  "data": [
    { "id": "isol-4.9",        "object": "model" },
    { "id": "isol-image",      "object": "model" },
    { "id": "isol-image-text", "object": "model" },
    { "id": "isol-video",      "object": "model" }
  ]
}

Não escreva essa lista no seu código. Ela depende do plano da chave, e a chamada acima sempre diz a verdade do momento.

Imagem

Endpoint síncrono: você espera e recebe a imagem na mesma resposta.

curl -s https://tokens.4clouders.com/v1/images/generations \
  -H "Authorization: Bearer $ISOL_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "isol-image",
    "prompt": "um cubo azul sobre fundo branco, luz de estudio",
    "n": 1,
    "size": "1024x1024"
  }'
POST /v1/images/generations model: "isol-image" prompt: "..." size: "1024x1024" ~90s data[0].b64_json a imagem, em base64. É aqui que ela está. data[0].url vem null. Sempre. Quem copiou um exemplo da OpenAI lê url, recebe nulo e conclui que a chamada falhou. Ela não falhou: o conteúdo está no outro campo.
Gere em segundo plano. Noventa segundos é mais que o timeout padrão de muita biblioteca, e o corte vem do seu lado, não da API.

O ponto que mais derruba integração: a imagem volta em data[0].b64_json, em base64. O campo url existe na resposta, mas vem null. Quem copiou um exemplo da OpenAI e lê url direto recebe nulo e acha que a chamada falhou. Ela não falhou: o conteúdo está no outro campo.

Gravando o arquivo, em Python:

import base64, os
from openai import OpenAI

client = OpenAI(base_url="https://tokens.4clouders.com/v1",
                api_key=os.environ["ISOL_API_KEY"])

r = client.images.generate(
    model="isol-image",
    prompt="um cubo azul sobre fundo branco, luz de estudio",
    n=1, size="1024x1024",
)
open("saida.png", "wb").write(base64.b64decode(r.data[0].b64_json))

Quanto demora. Uma imagem de 512x512 levou cerca de 90 segundos na medição que fizemos. Não é um endpoint para deixar no caminho de um clique do usuário esperando na tela: gere em segundo plano e avise quando terminar. Se a sua aplicação tem timeout padrão de 30 ou 60 segundos, aumente antes de testar, senão você vai culpar a API por um corte que foi seu.

isol-image ou isol-image-text?

Os dois geram imagem no mesmo endpoint, mudando só o campo model. Use isol-image-text quando a peça precisa de texto legível dentro dela, como um cartaz ou um banner com chamada. Para foto de produto, cena e fundo, isol-image entrega melhor.

Uma coisa que vale dizer antes que você descubra tentando: difusão não desenha logo de marca de forma confiável a partir do zero. Se a peça precisa do seu logo exato, gere o fundo e componha o logo por cima, ou parta de uma imagem real. É limitação da tecnologia, não da nossa instalação dela.

Vídeo

Vídeo é assíncrono, e tem que ser: leva minutos. Você envia o pedido, recebe um job e consulta até ficar pronto.

curl -s https://tokens.4clouders.com/v1/videos \
  -H "Authorization: Bearer $ISOL_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model": "isol-video", "prompt": "um cubo azul girando devagar"}'

A resposta vem com HTTP 202 e o job:

{
  "id": "vid_f1621757c272",
  "object": "video.job",
  "status": "queued",
  "queue_position": 0,
  "eta_seconds": 180
}

A partir daí, consulte pelo id:

curl -s https://tokens.4clouders.com/v1/videos/vid_f1621757c272 \
  -H "Authorization: Bearer $ISOL_API_KEY"
POST /v1/videos model: "isol-video" 202 job em fila id, status, eta_seconds GET /v1/videos/{id} a cada 15 a 20 segundos enquanto status for queued ou running url o vídeo pronto error a falha, se houver No fim, um dos dois deixa de ser null:
Consultar a cada segundo não deixa o vídeo pronto mais cedo, só gasta a sua cota. O campo eta_seconds existe justamente para você espaçar.

O job traz status, progress, queue_position, eta_seconds, e dois campos que ficam null até o fim: url, com o vídeo pronto, e error, se algo falhar. Trate os dois: um job que termina em erro também sai da fila.

Consulte com intervalo, não em laço apertado. O eta_seconds existe para isso. Perguntar a cada segundo não deixa o vídeo pronto mais cedo, só gasta a sua cota de requisição. Consultar a cada 15 ou 20 segundos é suficiente.

Os erros que você vai encontrar

ATENÇÃO

Quatro erros respondem por quase tudo

Vale ler esta tabela antes de subir. Os quatro abaixo aparecem em quase todo primeiro uso, e três deles têm a mesma causa.

Ir para produção

CódigoO que aconteceuO que fazer
404 no endpoint Endereço errado. /v1/images não existe. Use /v1/images/generations.
404 com Model Group Modelo de imagem chamado no endpoint de chat, ou o contrário. Cada modelo tem o seu endereço. Veja a tabela em Primeiros passos.
400 Invalid model name Faltou o campo model no corpo. Media não tem modelo padrão: é sempre explícito.
429 limite de jobs simultâneos A chave já tem mídia em processamento. Enfileire do seu lado e espere o job anterior. Não é falta de crédito.

Levando para produção

Vai colocar mídia em produção e quer revisar o desenho antes? Fale com a engenharia. Preferimos ajustar o fluxo com você antes de você descobrir o limite em produção.