Saltar al contenido principal
SocialCutter

API y desarrollo

Procesa imágenes con la API desde la terminal (curl)

Guia practica de la API de SocialCutter con curl: salud, credenciales, plataformas, procesado por URL y por fichero, historial, monedero y errores tipicos.

  • curl
  • API
  • SocialCutter
  • terminal
  • jq
  • procesar imagenes
  • API key

Antes de empezar

Necesitas curl y jq. Guarda la base y la clave en variables para no repetirlas:

export API_URL="https://api.socialcutter.theboomer.dev"
export API_KEY="sc_tu_clave"

La referencia completa está en https://docs.socialcutter.theboomer.dev.

1. Obtener la API key

Entra en https://dash.socialcutter.theboomer.dev, abre Perfil → API keys y crea una clave. Empieza por sc_, se muestra una sola vez y solo puede haber una activa por cuenta. Si creas otra sin revocar la anterior, la API responde 400.

2. Comprobar salud y credenciales

# Salud: endpoint publico, no requiere clave
curl -s "$API_URL/api/v1/health" | jq

# Identidad de la cuenta que usa la clave
curl -s "$API_URL/api/v1/auth/me" -H "X-API-Key: $API_KEY" | jq

# Usos disponibles
curl -s "$API_URL/api/v1/credits" -H "X-API-Key: $API_KEY" | jq

/api/v1/health devuelve el estado del servicio, la versión, el uptime y la conexión con la base de datos. /api/v1/auth/me confirma qué cuenta está usando la clave. Si esta llamada devuelve 401, la clave está mal o revocada.

3. Listar plataformas, formatos y modos

# Forma de la respuesta: primero las claves de nivel superior
curl -s "$API_URL/api/v1/platforms" | jq 'keys'

# Todas las plataformas con sus formatos, medidas y relacion de aspecto
curl -s "$API_URL/api/v1/platforms" | jq

# Formatos de salida y modos de ajuste
curl -s "$API_URL/api/v1/formats" | jq
curl -s "$API_URL/api/v1/fit-modes" | jq

/platforms, /formats y /fit-modes son públicos. Empieza por jq 'keys' para ver la forma real de la respuesta y después recórrela con la ruta que necesites.

Estas son las combinaciones que acepta destinations:

PlataformaFormatoMedidasRelación
instagrampost1080x10801:1
instagramstory1080x19209:16
instagramlandscape1080x5661.91:1
facebookpost1200x6301.91:1
facebookstory1080x19209:16
facebookcover820x3122.63:1
twitterpost1200x67516:9
twitterheader1500x5003:1
linkedinpost1200x6271.91:1
linkedincover1128x1915.9:1
youtubethumbnail1280x72016:9
youtubebanner2560x144016:9
tiktokcover1080x19209:16

4. Procesar una imagen por URL

curl -s -X POST "$API_URL/api/v1/images/process" \
  -H "X-API-Key: $API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: demo-001" \
  -d '{
    "source": { "type": "url", "value": "https://example.com/foto.jpg" },
    "destinations": [
      { "platform": "instagram", "format": "post" },
      { "platform": "tiktok", "format": "cover" }
    ]
  }' | jq

El campo source indica de dónde viene la imagen (url o base64) y destinations es la lista de plataforma y formato que quieres. La cabecera Idempotency-Key hace seguros los reintentos; sin ella la API genera una clave aleatoria por petición.

5. Procesar un fichero local

curl -s -X POST "$API_URL/api/v1/images/process/upload" \
  -H "X-API-Key: $API_KEY" \
  -F "file=@./foto.jpg" \
  -F 'destinations=[{"platform":"linkedin","format":"post"},{"platform":"youtube","format":"thumbnail"}]' | jq

En multipart el fichero va en file y destinations como una cadena JSON en un campo del formulario. El límite es 5 MB; por encima la API responde 413.

Alternativa en base64

POST /api/v1/images/upload acepta la imagen como cadena base64 en el cuerpo JSON, sin fichero ni URL de origen. Úsalo solo cuando la imagen no tenga una URL pública accesible.

6. Leer la respuesta y descargar un resultado

La respuesta trae image_id y una lista outputs, una por destino, con la URL del resultado, la plataforma, el formato y las medidas.

# Guarda la respuesta en un fichero
curl -s -X POST "$API_URL/api/v1/images/process" \
  -H "X-API-Key: $API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "source": { "type": "url", "value": "https://example.com/foto.jpg" },
    "destinations": [{ "platform": "instagram", "format": "post" }]
  }' > out.json

# Id, plataforma y formato de cada salida
jq '.image_id, (.outputs[] | {url, platform, format})' out.json

# Descarga el primer resultado
curl -s -o resultado.webp "$(jq -r '.outputs[0].url' out.json)"

Si alguna clave de medidas no aparece, imprime el objeto completo con jq '.outputs[0]' para ver su forma real.

7. Historial y monedero

# Ultimas 10 imagenes
curl -s "$API_URL/api/v1/history?limit=10" -H "X-API-Key: $API_KEY" | jq

# Solo las creadas desde la API
curl -s "$API_URL/api/v1/history?origin=api&limit=10" -H "X-API-Key: $API_KEY" | jq

# Monedero: cuota diaria, usada, restante, bolsa extra y saldo comprado
curl -s "$API_URL/api/v1/wallet" -H "X-API-Key: $API_KEY" | jq

limit admite de 1 a 100 (por defecto 50) y skip sirve para paginar. El filtro origin distingue browser (dashboard) de api.

8. Elegir el modo de ajuste

fit_mode controla cómo encaja la imagen en cada formato:

ModoComportamiento
coverEscala y recorta el exceso de forma centrada. Es el valor por defecto.
containEncaja la imagen completa y rellena con background_color.
fillEstira la imagen.
stretchFuerza las dimensiones exactas.
curl -s -X POST "$API_URL/api/v1/images/process" \
  -H "X-API-Key: $API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "source": { "type": "url", "value": "https://example.com/foto.jpg" },
    "destinations": [{ "platform": "facebook", "format": "cover" }],
    "options": { "fit_mode": "contain", "format": "webp", "quality": 85 }
  }' | jq

El recorte de cover es centrado. En options también puedes fijar format (webp, png, jpg, gif) y quality (1 a 100, por defecto 85).

Reintentos, lotes y paginación

  • Reutiliza la misma cabecera Idempotency-Key cuando reintentes una petición: la API no la procesa dos veces.
  • POST /api/v1/images/batch procesa varias imágenes en una sola llamada y devuelve el resultado por índice. Los elementos fallidos se devuelven.
  • GET /api/v1/history pagina con limit (de 1 a 100) y skip.
  • Cada respuesta incluye la cabecera X-Tentpole-Version con la versión en ejecución.

Coste

  • 1 uso por destino (plataforma y formato) por petición.
  • Destinos repetidos en la misma petición no se cobran dos veces.
  • Los procesamientos fallidos se devuelven.

Errores típicos

CódigoSignificado
400Payload inválido: plataforma, formato o modo desconocido, JSON mal formado, o clave ya activa
401Credenciales ausentes, mal formadas, caducadas o revocadas
404Recurso no encontrado (id de imagen o de fichero)
413El fichero supera 5 MB
422Error de validación de la petición
429Cuota del monedero agotada
500Fallo de procesamiento; los usos de esa petición se devuelven

Siguientes pasos

Preguntas frecuentes

¿Dónde consigo la clave de API?

En el dashboard, en Perfil → API keys. Empieza por sc_, se muestra una sola vez y solo puede haber una clave activa por cuenta.

¿Cómo envío la clave en cada petición?

Con la cabecera X-API-Key: sc_... (preferida) o Authorization: Bearer sc_.... Los endpoints públicos como /api/v1/health y /api/v1/platforms no requieren clave.

¿Qué diferencia hay entre procesar por URL y por fichero?

POST /api/v1/images/process recibe un JSON con source (URL o base64) y destinations. POST /api/v1/images/process/upload recibe el fichero real como multipart, sin pasar por base64, y admite hasta 5 MB.

¿Cómo se cobra el procesamiento?

1 uso por destino, es decir por cada combinación de plataforma y formato. Los destinos repetidos en la misma petición no se cobran dos veces y los fallos se devuelven.

¿Cómo cambio el recorte?

Con fit_mode en options. cover (por defecto) escala y recorta el exceso de forma centrada, contain encaja la imagen completa con relleno, fill la estira y stretch fuerza las dimensiones exactas.