Saltar al contenido principal
SocialCutter

IA y agentes

Automatiza el recorte de imágenes con n8n

Conecta n8n con la API de SocialCutter: disparador de imagen nueva, nodo HTTP Request, reparto a redes y CMS y coste por ejecución.

  • n8n
  • automatización
  • HTTP Request
  • Webhook
  • SocialCutter
  • redes sociales
  • API key

Por qué automatizar

Una imagen maestra sirve para Instagram, LinkedIn, X y la portada del blog. Hacerlo a mano, formato a formato, no escala cuando publicas a diario o cuando el catálogo tiene cientos de productos. n8n encaja porque ya vigila dónde aparecen las imágenes nuevas y porque puede llamar a cualquier API HTTP. SocialCutter recorta de forma centrada a las medidas exactas de cada destino y devuelve una URL por salida; n8n se encarga de mover esa URL al sitio correcto.

Cómo encaja SocialCutter en n8n

El flujo tiene tres pasos:

  1. Un disparador detecta una imagen nueva.
  2. Un nodo HTTP Request llama a SocialCutter con la URL de esa imagen y la lista de destinos.
  3. La respuesta trae una salida por destino; se reparte a las redes o al CMS.

SocialCutter expone una API REST en https://api.socialcutter.theboomer.dev y la autenticación va en la cabecera X-API-Key (o Authorization: Bearer). La referencia completa está en https://docs.socialcutter.theboomer.dev.

El disparador: cuando llega una imagen nueva

Depende de dónde aparezca la imagen:

  • Webhook: un nodo Webhook recibe un POST con la URL de la imagen. Es lo más flexible si ya tienes un formulario, un panel propio o un script que sube imágenes.
  • Google Drive: el nodo Google Drive Trigger se dispara con File Created o File Updated en una carpeta vigilada.
  • SharePoint: el nodo Microsoft SharePoint con el evento de fichero creado cubre el mismo caso en entornos Microsoft 365.

En todos los casos el disparador debe entregar, como mínimo, una URL pública de la imagen. La API de SocialCutter necesita poder descargarla: si el origen exige sesión, sirve la imagen por un enlace firmado o sube el fichero con el endpoint de multipart.

Llamar a SocialCutter desde el nodo HTTP Request

Guardar la API key en credenciales

Crea una credencial de tipo Header Auth:

  • Name: X-API-Key
  • Value: sc_tu_clave

Selecciónala en el nodo HTTP Request. Así la clave queda fuera del JSON del workflow y no se filtra al exportarlo. Como alternativa en servidores autoalojados, define la variable de entorno SOCIALCUTTER_API_KEY y referencia {{ $env.SOCIALCUTTER_API_KEY }}.

El cuerpo de la petición

  • Método: POST
  • URL: https://api.socialcutter.theboomer.dev/api/v1/images/process
  • Body: JSON
{
  "source": { "type": "url", "value": "={{ $json.image_url }}" },
  "destinations": [
    { "platform": "instagram", "format": "post" },
    { "platform": "linkedin", "format": "post" },
    { "platform": "twitter", "format": "post" }
  ],
  "options": { "fit_mode": "cover" }
}

El campo source acepta url o base64; destinations es la lista de plataforma y formato. fit_mode: cover escala y recorta el exceso de forma centrada, que es el comportamiento por defecto. Si necesitas encajar la imagen completa, usa contain con background_color.

Mandar la imagen: URL en JSON, multipart o binario

El nodo HTTP Request entrega la imagen de tres maneras distintas, y elegir mal es la causa habitual de que “el nodo no suba la imagen”. En Send Body → Body Content Type, n8n documenta estas opciones: Form URLencoded, Form-Data, JSON, n8n Binary File y Raw.

1. La URL dentro del JSON, que es lo normal con SocialCutter. La imagen no sale de n8n: viaja como texto en el campo source y la API la descarga por su cuenta. El nodo no necesita ninguna propiedad binaria.

  • Body Content Type: JSON
  • Cuerpo: { "source": { "type": "url", "value": "https://tu-cdn.com/maestro.jpg" }, "destinations": [...] }

source acepta una URL pública o un base64 ya presente en el JSON. Si el origen exige sesión, o si los bytes de la imagen ya están dentro de n8n, hay que subir el fichero por la vía 2.

2. multipart/form-data con el fichero como campo. Aquí el nodo sí envía los bytes. n8n documenta esta combinación como la solución al error 415 Unsupported media type:

  • Body Content Type: Form-Data (el nodo envía multipart/form-data)
  • Añade un Body Parameter y pon su Type en n8n Binary File
  • Name: el nombre del campo que espera la API, es decir el campo file del endpoint de subida
  • Input Data Field Name: el nombre de la propiedad binaria del ítem, normalmente data

3. n8n Binary File como cuerpo entero. Manda el contenido del fichero como cuerpo de la petición, con su propio tipo de contenido. Solo vale si la API acepta un cuerpo en crudo; si espera un campo con nombre dentro de un formulario, no sirve.

Por qué el nodo “no sube la imagen”

Los fallos típicos, en orden de frecuencia:

  • Body Content Type en JSON con un ítem binario: el binario se ignora, al servidor le llega JSON sin fichero y responde con un error de validación. Si la API espera una URL, este es el camino correcto y no hay nada que subir.
  • Form-Data con un parámetro de tipo Form Data: se envía un campo de texto con el nombre del fichero, no los bytes.
  • El ítem no trae binario: si el nodo anterior solo produjo JSON (una URL, un objeto), no hay fichero que enviar. Hay que descargarlo antes: un nodo HTTP Request con GET y Response Format: File deja la descarga en una propiedad binaria (indica el nombre en Put Output in Field, por ejemplo data) y el nodo multipart ya puede enviarla.
  • Input Data Field Name que no coincide: el nombre debe ser exactamente el de la propiedad binaria del ítem (data, image, el que sea).
  • Nombre de fichero equivocado: n8n documenta el caso del fichero que llega con otro nombre y lo resuelve fijando el nombre en la propiedad binaria desde un nodo Code.

Repartir las salidas: redes y CMS

La respuesta incluye image_id y un array outputs, una entrada por destino, con la URL del resultado, la plataforma, el formato y las medidas. Añade un nodo Split Out sobre el campo outputs para convertirlo en un elemento por salida y después enruta por plataforma:

  • Instagram, LinkedIn, X y TikTok tienen nodos propios en n8n: la URL de cada salida se pasa al nodo de publicación correspondiente.
  • Para un CMS sin nodo oficial, encadena otro nodo HTTP Request con la URL de subida del medio (por ejemplo la API de medios del CMS) usando la URL de la salida como fichero a descargar.

Mantén un campo común, por ejemplo platform, para que el router (Switch) sepa por dónde continuar.

Workflow mínimo importable

Pega este JSON en n8n con Import from clipboard. Trae el disparador y la llamada a la API; añade después el reparto.

{
  "name": "SocialCutter - reparto de imagen",
  "nodes": [
    {
      "parameters": {
        "httpMethod": "POST",
        "path": "socialcutter-nueva-imagen",
        "responseMode": "onReceived"
      },
      "id": "webhook-1",
      "name": "Webhook nueva imagen",
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 2,
      "position": [220, 300],
      "webhookId": "socialcutter-nueva-imagen"
    },
    {
      "parameters": {
        "method": "POST",
        "url": "https://api.socialcutter.theboomer.dev/api/v1/images/process",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            { "name": "X-API-Key", "value": "={{ $env.SOCIALCUTTER_API_KEY }}" }
          ]
        },
        "sendBody": true,
        "specifyBody": "json",
        "jsonBody": "={{ JSON.stringify({ source: { type: 'url', value: $json.image_url }, destinations: [{ platform: 'instagram', format: 'post' }, { platform: 'linkedin', format: 'post' }], options: { fit_mode: 'cover' } }) }}",
        "options": {}
      },
      "id": "http-1",
      "name": "SocialCutter procesar",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [460, 300]
    }
  ],
  "connections": {
    "Webhook nueva imagen": {
      "main": [[{ "node": "SocialCutter procesar", "type": "main", "index": 0 }]]
    }
  },
  "settings": { "executionOrder": "v1" }
}

Si prefieres la credencial Header Auth, borra el bloque headerParameters y selecciona la credencial en el nodo. El webhookId debe coincidir con el path para que la URL del webhook funcione.

Manejo de errores y reintentos

  • Activa Retry On Fail en el nodo HTTP Request con 2 o 3 intentos: cubre caídas puntuales de red.
  • Marca Continue On Fail si quieres que una salida fallida no aborte todo el workflow.
  • Envía la cabecera Idempotency-Key con un valor estable (por ejemplo el id del fichero) para que un reintento no genere trabajo duplicado.
  • Los códigos de error más comunes: 401 (clave ausente o revocada), 413 (fichero de más de 5 MB), 422 (validación) y 429 (cuota agotada).

Coste por ejecución

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

Una ejecución que pide Instagram post, LinkedIn post y X post consume 3 usos. Si el disparador recibe ráfagas de imágenes, agrupa antes de llamar o usa el endpoint POST /api/v1/images/batch.

Alternativas a n8n

Si ya usas otra plataforma de automatización, el patrón es el mismo: un disparador y una llamada HTTP con la cabecera X-API-Key. Consulta la documentación oficial de Make y de Zapier para el nodo HTTP genérico de cada una.

Siguientes pasos

Preguntas frecuentes

¿Hace falta un nodo específico de SocialCutter en n8n?

No. Se usa el nodo HTTP Request, que viene de serie. SocialCutter es una API REST y basta con la URL base, la cabecera de autenticación y el cuerpo JSON.

¿Dónde guardo la API key en n8n?

En una credencial de tipo Header Auth, con Name = X-API-Key y Value = tu clave sc_, o en una variable de entorno del servidor n8n. Nunca la pegues en el cuerpo del nodo ni en el JSON del workflow.

¿Cómo se cobra cada ejecución?

1 uso por destino, es decir por cada combinación de plataforma y formato. Una ejecución que pide Instagram post y LinkedIn post consume 2 usos.

¿Qué pasa si una salida falla?

La API devuelve el estado por destino en la respuesta. Configura el nodo con Continue On Fail o un manejo de errores propio para no perder las salidas que sí se generaron.

¿Cuál es el tamaño máximo de una imagen?

5 MB por fichero. Por encima la API responde 413. En n8n, si la imagen viene de un fichero local, se sube por multipart con el endpoint de upload.

El nodo HTTP Request no sube la imagen. ¿Qué reviso?

El Body Content Type. Con JSON el fichero no viaja: manda la URL en el campo source y deja que la API la descargue. Para enviar bytes de verdad, elige Form-Data, añade un Body Parameter de tipo n8n Binary File y apunta Input Data Field Name a la propiedad binaria del ítem, normalmente data. Es la combinación que documenta n8n para el error 415 Unsupported media type.