Es una API: no tiene interfaz gráfica propia. Un pack se genera en
segundo plano porque cada imagen pasa por la GPU de una en una — cuenta con varios
minutos (unos 40 segundos por imagen).
# 1. lanzar el trabajo -> devuelve un id
curl -s -X POST https://emoji.apicloud.lat/api/v1/jobs \
-H 'Content-Type: application/json' \
-d '{"prompt":"mascota robot simpática con antena azul",
"style_id":"apple_3d",
"variation_set_id":"minimal_5"}'
# 2. consultar el estado (repetir hasta que sea "completed")
curl -s https://emoji.apicloud.lat/api/v1/jobs/<JOB_ID>
# 3. descargar el pack en ZIP
curl -s -o pack.zip https://emoji.apicloud.lat/api/v1/jobs/<JOB_ID>/archive
import time, requests
BASE = "https://emoji.apicloud.lat/api/v1"
job = requests.post(f"{BASE}/jobs", json={
"prompt": "mascota robot simpática con antena azul",
"style_id": "apple_3d",
"variation_set_id": "minimal_5",
}).json()
# la GPU genera de una en una: espera con paciencia, no en bucle cerrado
while True:
st = requests.get(f"{BASE}/jobs/{job['id']}").json()
if st["status"] in ("completed", "failed"):
break
time.sleep(15)
if st["status"] == "completed":
zipped = requests.get(f"{BASE}/jobs/{job['id']}/archive").content
open("pack.zip", "wb").write(zipped)
import { writeFile } from "node:fs/promises";
const BASE = "https://emoji.apicloud.lat/api/v1";
const job = await (await fetch(`${BASE}/jobs`, {
method: "POST", headers: { "Content-Type": "application/json" },
body: JSON.stringify({
prompt: "mascota robot simpática con antena azul",
style_id: "apple_3d", variation_set_id: "minimal_5",
}),
})).json();
let st;
do {
await new Promise(r => setTimeout(r, 15000));
st = await (await fetch(`${BASE}/jobs/${job.id}`)).json();
} while (!["completed", "failed"].includes(st.status));
if (st.status === "completed") {
const buf = await (await fetch(`${BASE}/jobs/${job.id}/archive`)).arrayBuffer();
await writeFile("pack.zip", Buffer.from(buf));
}
Estilos: apple_3d, clay, flat_vector,
pixel, neon. Sets: minimal_5 (6 imágenes),
classic_10, creator_10, support_10 (11 imágenes).
El pack incluye los PNG con fondo transparente, una hoja de contactos, el manifiesto y el
ZIP. También hay /manifest y /contact-sheet por separado, y
/api/v1/prompts/inspect para ver cómo quedará el prompt antes de gastar GPU.
Límites de uso: 4 packs por hora por
conexión (respuesta 429) y 3 trabajos simultáneos en todo el servicio
(503 con Retry-After cuando la cola de GPU va llena — reintenta
en unos minutos). Los batches cuentan cada prompt por separado.
Limitación honesta: la identidad del
personaje varía entre variaciones, porque cada una es una generación independiente. El
recorte y el encuadre salen limpios; la coherencia del personaje entre imágenes todavía no.