Pular para o conteúdo

Qwen-ImageReferência da API

Gere e edite imagens com os modelos Qwen-Image por código: um início rápido em três etapas, todos os campos, créditos por imagem, webhooks e idempotência.

BetaEndpointPOST /v1/images/generationsOpenAPIllms.txt
Solicitar acesso à API

O acesso à API para desenvolvedores é por solicitação.

A API de imagens está em beta, e os campos podem mudar. O estúdio não é afetado.

Início rápidoem três chamadas

Defina uma chave, envie a tarefa com um limite de preço e depois leia o resultado.

  1. 01

    Defina sua chave

    O acesso à API para desenvolvedores é por solicitação: peça no estúdio, em Chaves de API. A chave é exibida uma única vez, então guarde-a em uma variável de ambiente.

    Shell
    export API_KEY="sk_test_…"
  2. 02

    Envie a tarefa

    Envie a imagem por POST com um Idempotency-Key e um limite max_credits. Os modelos de edição também recebem image_url. Você recebe 202 e uma tarefa na fila, e os créditos ficam reservados.

    POST /images/generations
    curl https://api.pershot.app/v1/images/generations \
      -H "Authorization: Bearer $API_KEY" \
      -H "Idempotency-Key: $(uuidgen)" \
      -H "Content-Type: application/json" \
      -d '{
        "model": "qwen-image-2512",
        "prompt": "A ceramic mug on a walnut table, soft window light, product photo",
        "size": "1K",
        "aspect_ratio": "1:1",
        "max_credits": 2
      }'
    Você deve ver
    {
      "id": "job_01J9ZK4T8W",
      "object": "job",
      "kind": "image",
      "status": "queued",
      "money_status": "reserved",
      "queue_position": 2,
      "requested_model": "qwen-image-2512",
      "credits_quoted": 2,
      "credits_charged": null
    }
  3. 03

    Leia o resultado

    Consulte a tarefa por GET até o status ser succeeded. outputs[].url é assinada e expira após 24 horas, então baixe o que quiser guardar.

    GET /jobs/{id}
    curl https://api.pershot.app/v1/jobs/job_01J9ZK4T8W \
      -H "Authorization: Bearer $API_KEY"

Parâmetrose limites

Lidos do documento OpenAPI, que é gerado a partir dos mesmos esquemas que a API usa na validação. Campos desconhecidos são recusados.

Campos de requisição do Qwen-Image
CampoTipoValores aceitosObservações
modelObrigatóriostringqwen-image-2512-lightning · qwen-image-2512 · qwen-image-edit-2511-lightning · qwen-image-edit-2511O ID do modelo.
promptObrigatóriostring2–2.000 caracteresO que gerar: o assunto, a câmera e a luz.
sizePadrão: "1K"string1K · 2K1K para rascunhos e primeiros quadros, 2K para detalhes.
aspect_ratioPadrão: "1:1"string16:9 · 9:16 · 1:1Formato do quadro.
image_urlOpcionalstringURL httpsPrimeiro quadro do vídeo; a imagem de origem nos modelos de edição. Uma URL https pública ou a URL de um arquivo enviado.
seedOpcionalinteger0–2.147.483.647Repete um resultado com as mesmas entradas.
quote_idOpcionalstringqt_…Executa pelo preço de uma cotação de POST /v1/quotes, válida por 10 minutos.
max_creditsOpcionalnumber> 0O máximo que esta tarefa pode custar. Acima disso, a tarefa é recusada, nunca cobrada.
webhook_urlOpcionalstringURL httpsUma URL https que recebe os eventos da tarefa.
end_user_idOpcionalstring1–128 caracteresPara contas de desenvolvedor aprovadas (o acesso é por solicitação): o seu próprio ID de usuário para esta solicitação, exibido nos dados de uso.
project_idOpcionalstringprj_…
shot_idOpcionalstringsht_…
routing_preferenceOpcionalstringstability · speed

Envie exatamente um entre quote_id e max_credits. Este endpoint recusa model "auto": para vídeo, chame primeiro POST /v1/auto/plan e depois envie o modelo escolhido com max_credits.

Modelos
qwen-image-2512-lightningGeração · Qwen-Image-2512 · Lightning 4-stepqwen-image-edit-2511-lightningEdição · Qwen-Image-Edit-2511 · Lightningqwen-image-2512Geração · Qwen-Image-2512qwen-image-edit-2511Edição · Qwen-Image-Edit-2511
Taxa de requisições e simultaneidade
60 requisições por minuto por chave e 3 tarefas ao mesmo tempo por conta, por padrão. Mais chaves não aumentam a simultaneidade.
Para agentes de IA
Texto simples para agentes de IA: entradas, valores aceitos, cada preço e um exemplo de requisiçãoqwen-image-2512-lightningqwen-image-2512qwen-image-edit-2511-lightningqwen-image-edit-2511

Limites

Lidos da mesma tabela que a API usa nas verificações. Cada linha diz quem verifica o limite e o que acontece quando ele é ultrapassado.

  • Validado por nósVerificamos e respondemos 400 antes de qualquer cotação ou reserva.
  • Validado pelo fornecedorO fornecedor verifica. Uma tarefa recusada por ele falha, e nada é cobrado.
  • RecomendadoNinguém verifica. Ficar dentro do limite dá resultados melhores.
Limites para qwen-image-2512-lightning, qwen-image-2512
LimiteValorUnidadeQuem verificaAcima do limite
Requisição
Tamanho do promptprompt2 a 2.000caracteresValidado por nós400 invalid_request no campo prompt, antes de qualquer cotação ou reserva.
Tamanho da imagemsize1K, 2KPadrão: 1K–Validado por nós400 invalid_request no campo size.
Proporçãoaspect_ratio16:9, 9:16, 1:1Padrão: 1:1–Validado por nós400 invalid_request no campo aspect_ratio.
Imagens que você envia
Imagem de origemimage_urlNenhuma–Validado por nósModelos de edição exigem image_url, e modelos de geração o recusam: 400 invalid_request no campo image_url.
Saída
Pixels de saída1K16:91344×7689:16768×13441:11024×10242K16:92048×11529:161152×20481:12048×2048pxValidado por nósPedimos exatamente estes tamanhos.
Lado da saída256 a 2.048px por ladoValidado pelo fornecedorTodos os tamanhos acima estão dentro do limite. O fornecedor recusa tamanhos maiores.
Formato de saídaJPEG–Validado por nósToda imagem é um JPEG.
Links
Link do resultado24horasValidado por nósDepois disso, o link responde 403. Faça um novo GET da tarefa para obter um link novo. O arquivo em si é mantido por 12 meses (outputs_expire_at da tarefa indica a data), e por mais tempo se o resultado estiver salvo em Mídias ou for usado em um projeto.
Limites para qwen-image-edit-2511-lightning, qwen-image-edit-2511
LimiteValorUnidadeQuem verificaAcima do limite
Requisição
Tamanho do promptprompt2 a 2.000caracteresValidado por nós400 invalid_request no campo prompt, antes de qualquer cotação ou reserva.
Tamanho da imagemsize1K, 2KPadrão: 1K–Validado por nós400 invalid_request no campo size.
Proporçãoaspect_ratio16:9, 9:16, 1:1Padrão: 1:1–Validado por nós400 invalid_request no campo aspect_ratio.
Imagens que você envia
Imagem de origemimage_urlExatamente 1–Validado por nósModelos de edição exigem image_url, e modelos de geração o recusam: 400 invalid_request no campo image_url.
Tamanho do enviofileaté 10MBValidado por nósPOST /v1/uploads responde 400 invalid_request no campo file.
Formatos de enviofileJPEG, PNG, WebP–Validado por nósIdentificado pelo próprio arquivo, não pelo nome dele. Qualquer outro: 400 invalid_request no campo file.
Saída
Pixels de saída1K16:91344×7689:16768×13441:11024×10242K16:92048×11529:161152×20481:12048×2048pxValidado por nósPedimos exatamente estes tamanhos.
Lado da saída512 a 2.048px por ladoValidado pelo fornecedorTodos os tamanhos acima estão dentro do limite. O fornecedor recusa tamanhos maiores.
Formato de saídaJPEG–Validado por nósToda imagem é um JPEG.
Links
Link de envio7diasValidado por nósDepois disso, o link responde 403. Envie o arquivo de novo.
Link do resultado24horasValidado por nósDepois disso, o link responde 403. Faça um novo GET da tarefa para obter um link novo. O arquivo em si é mantido por 12 meses (outputs_expire_at da tarefa indica a data), e por mais tempo se o resultado estiver salvo em Mídias ou for usado em um projeto.

Nunca buscamos imagens em outros sites, então, nesses links, quem verifica o tamanho é o fornecedor, e uma tarefa que ele recusa não é cobrada. Os mesmos limites também vêm em JSON: GET /v1/models retorna um objeto limits para cada modelo.

Preçoscalculados às claras

Um preço por imagem, por modelo e tamanho, em créditos (US$ 1 = 100 créditos). Geração e edição têm preços separados.

Preços do Qwen-Image
Modelo1K2K
qwen-image-2512-lightningGeração1 cr≈ US$ 0,01≈ 1.000 imagens por US$ 103 cr≈ US$ 0,03≈ 333 imagens por US$ 10
qwen-image-edit-2511-lightningEdição2 cr≈ US$ 0,02≈ 500 imagens por US$ 104 cr≈ US$ 0,04≈ 250 imagens por US$ 10
qwen-image-2512Geração2 cr≈ US$ 0,02≈ 500 imagens por US$ 106 cr≈ US$ 0,06≈ 166 imagens por US$ 10
qwen-image-edit-2511Edição3 cr≈ US$ 0,03≈ 333 imagens por US$ 1010 cr≈ US$ 0,10≈ 100 imagens por US$ 10

Webhookse idempotência

Novas tentativas nunca geram cobrança dupla, e você não precisa consultar a tarefa periodicamente.

Idempotência
Todo POST de geração exige um Idempotency-Key (de 1 a 255 caracteres ASCII visíveis). A mesma chave dentro de 24 horas retorna a mesma tarefa com HTTP 200, então uma nova tentativa após um timeout nunca cria nem cobra uma segunda tarefa.
Prompts recusados
Um prompt recusado pela pré-verificação (422 content_rejected) não cria nada, então a mesma chave pode ser usada de novo com um novo prompt.
Eventos
job.queuedjob.processingjob.succeededjob.failedjob.cancelled
Assinatura
X-Signature traz t, o tempo Unix, e v1, um HMAC-SHA256 de t, um ponto e o corpo bruto, com o seu segredo whsec_ como chave. Recuse carimbos de data/hora com mais de cinco minutos e elimine duplicatas pelo X-Event-Id.
Entrega
Um 2xx em até 10 segundos conta como entregue. Entregas com falha são repetidas após 1 min, 5 min, 30 min, 2 h e 6 h. Redirecionamentos não são seguidos.
Corpo do webhook
{
  "id": "evt_01J9ZKB1QX",
  "type": "job.succeeded",
  "created_at": "2026-09-29T14:02:31Z",
  "data": {
    "job": {
      "id": "job_01J9ZK4T8W",
      "object": "job",
      "kind": "image",
      "status": "succeeded",
      "money_status": "settled",
      "requested_model": "qwen-image-2512",
      "credits_charged": 2,
      "outputs": [
        {
          "kind": "image",
          "url": "https://…/job_01J9ZK4T8W.png?sig=…"
        }
      ]
    }
  }
}
Verificar X-Signature
import { createHmac, timingSafeEqual } from "node:crypto";

// rawBody: the request body exactly as received, before any JSON parsing.
export function verifyWebhook(header, rawBody, secret, toleranceSec = 300) {
  let t = null;
  const signatures = [];
  for (const item of (header ?? "").split(",")) {
    const [key, value] = item.split("=", 2);
    if (key === "t") t = Number(value);
    if (key === "v1") signatures.push(Buffer.from(value, "hex"));
  }
  if (!t || Math.abs(Date.now() / 1000 - t) > toleranceSec) return false;
  const expected = createHmac("sha256", secret).update(`${t}.${rawBody}`).digest();
  return signatures.some((s) => s.length === expected.length && timingSafeEqual(s, expected));
}

// verifyWebhook(req.headers["x-signature"], rawBody, process.env.WEBHOOK_SECRET)
// Answer 2xx quickly, and skip an X-Event-Id you have already handled.

Errose o que fazer

Todo erro tem o mesmo formato: um objeto error com code, message, param e request_id. Os que você tem mais chance de encontrar:

CódigoHTTPO que fazer
invalid_request400Corrija o campo indicado em param.
unauthorized401Verifique a chave e o cabeçalho Bearer.
insufficient_credits402Recarregue e tente de novo com o mesmo Idempotency-Key.
forbidden_model403Adicione o modelo ou a ferramenta à lista de permissões da chave no estúdio, ou use outra chave. Ferramentas como Aprimorar precisam de uma entrada própria.
quote_expired409Peça uma nova cotação; as cotações valem por 10 minutos.
price_changed409O preço subiu acima do seu limite. Faça uma nova cotação ou aumente max_credits.
content_rejected422Nada foi cobrado. Altere o prompt ou as imagens.
rate_limited429Aguarde o Retry-After e tente de novo.
upstream_unavailable503O modelo está indisponível. Tente de novo mais tarde; uma tarefa que nunca começa não é cobrada.