Referência
POST /v1/videos
Crie um clipe com som a partir de um prompt de texto, no formato da OpenAI: os métodos videos do SDK funcionam só trocando a URL base. Enfileire, consulte, baixe uma vez, e ele é apagado.
Verificado em 6 de novembro de 2026
Criar um clipe
import os
import time
from openai import OpenAI
client = OpenAI(
base_url="https://nokeep.ai/v1",
api_key=os.environ["NOKEEP_API_KEY"],
)
clip = client.videos.create(
model="minimax-h3-max-turbo",
prompt="Waves breaking on a rocky coast at dusk",
seconds="5",
size="1280x720",
)
while clip.status in ("queued", "in_progress"):
time.sleep(5)
clip = client.videos.retrieve(clip.id)
if clip.status == "completed":
client.videos.download_content(clip.id).write_to_file("clip.mp4")Modelos
| Modelo | Bom para | 480p por segundo | 768p por segundo | 1080p por segundo |
|---|---|---|---|---|
| minimax-h3-max-turbo | Rápido, com som. O que você deve começar. | $0.045 | $0.07 | $0.14 |
| minimax-h3-max | Mais passos que o Turbo para um detalhe mais fino, com som. | $0.09 | $0.14 | $0.28 |
Você paga pelos segundos que pede. Os dois modelos fazem clipes de 5 a 15 segundos, com som.
Requisição
| Campo | Recebe | O que faz |
|---|---|---|
model | Obrigatório | Um dos ids de modelo acima. |
prompt | Obrigatório, até 10.000 caracteres | O que filmar, enviado ao modelo como foi escrito. Acima do limite é recusado, nunca cortado. |
seconds | 5 a 15 | A duração do clipe, como número ou texto. O padrão é 5. O 4 da OpenAI é recusado; 8 e 12 funcionam. |
size | WIDTHxHEIGHT | Escolhe a resolução e a proporção mais próximas. 1280x720 vira 768p em 16:9, e é isso que você paga. |
resolution | 480p, 768p ou 1080p | Define o preço e vence size. O padrão é 768p. |
aspect_ratio | 16:9, 21:9, 4:3, 1:1, 3:4, 9:16 | Vence size. O padrão é 16:9. |
Envie JSON ou o formulário multipart que os SDKs da OpenAI usam. Qualquer outro campo, como seed, é descartado e informado em x-nokeep-ignored. Um campo que carrega uma imagem ou clipe, como input_reference, é recusado com 400 unsupported_input: estes modelos trabalham só com texto. O SDK de Python da OpenAI mostra um aviso de descontinuação nos métodos videos, sobre o serviço de vídeo da própria OpenAI. Isso não afeta as chamadas para nós, e um verificador de tipos pode apontar o id do modelo.
As rotas do clipe
| Rota | O que faz |
|---|---|
POST /v1/videos | Enfileira um clipe e segura o preço. |
GET /v1/videos/{id} | Diz em que ponto ele está. Consulte a cada poucos segundos. |
GET /v1/videos/{id}/content | O mp4. Funciona uma vez, depois o clipe é apagado do host do modelo. Se o download for interrompido, peça de novo. |
DELETE /v1/videos/{id} | Apaga um clipe pronto sem baixá-lo. Um clipe ainda renderizando responde 409 video_not_ready. |
GET /v1/videos | Os clipes recentes da conta. |
O objeto do clipe
{
"id": "video_8f3a…",
"object": "video",
"model": "minimax-h3-max-turbo",
"status": "completed",
"progress": 100,
"created_at": 1793960000,
"completed_at": 1793960030,
"expires_at": 1794042800,
"seconds": "5",
"size": "1366x768",
"resolution": "768p",
"aspect_ratio": "16:9",
"error": null,
"downloaded": false,
"expired": false,
"usage": {
"nokeep_credits": 350
}
}statuséqueued,in_progress,completedoufailed.progressé 0 até o clipe ficar pronto, depois 100. O modelo não informa nada no meio.sizeé calculado a partir da resolução e da proporção, então o arquivo pode diferir em alguns pixels.
O que você paga
- O preço total do clipe fica reservado quando ele é enfileirado, contra seus créditos comprados e o teto diário da chave.
- Ele é cobrado quando o clipe termina, baixando ou não.
- Um clipe que falha não custa nada, e o status diz isso.
Onde o clipe fica
Um clipe pronto fica no host do modelo, em seu nível privado, por até 23 horas. Lá ele é apagado depois do único download, ou quando você o apaga. Nunca guardamos o arquivo, e depois desse prazo responde 410 video_gone. Nossa linha sobre o clipe guarda id, chave, modelo, duração, resolução, proporção, créditos e horários, nunca o prompt. Ela é apagada após 48 horas.
Conteúdo, limites e erros
Quatro limites rígidos continuam: conteúdo sexual envolvendo menores, conteúdo sexual de pessoas reais, dano em massa e alvo sendo uma pessoa real. Um prompt que cruza um deles recebe 422 hard_limit e não custa nada. O host de um modelo também pode recusar uma requisição, o que é 422 content_refused, também sem custo. Veja Limites rígidos.
Uma chave pode enfileirar 20 clipes por minuto, dentro de suas 120 requisições no total, e ter 10 renderizando ao mesmo tempo. Passando disso vem 429 rate_limited. A página de erros lista todos os códigos.
Para testar seu código sem gastar nada, envie sk-nokeep-test como chave. Ela roda todas as verificações, informa o clipe como pronto na hora com video_test, e o arquivo dele fica vazio.