API de Instagram: cómo publicar con código en 2026

La API de Instagram explicada: requisitos de cuenta e inicio de sesión, el flujo de 3 pasos con contenedores, el límite de 100 publicaciones y código ejecutable para imágenes, Reels y carruseles.

InvisibleAPI Team 15 min de lectura
View as Markdown
API de Instagram: cómo publicar con código en 2026
I

InvisibleAPI Team

InvisibleAPI Team

Publicar una publicación en Instagram desde tu aplicación, script o agente de IA parece que debería ser una única petición HTTP: enviar un pie de foto, adjuntar una imagen y recibir la URL de la publicación.

Bajo la Graph API oficial de Meta, la publicación programática funciona de forma distinta. Publicar en Instagram es un ciclo de vida de contenedores asíncrono. Creas un contenedor multimedia, consultas el estado hasta que Meta termina de descargar y procesar el archivo, y después lanzas una petición de publicación independiente. Además, tu código debe cumplir requisitos previos estrictos de cuenta, alojar archivos en servidores HTTPS públicos y gestionar flujos diferentes para imágenes, Reels y carruseles.

Este tutorial desglosa todo el proceso. Veremos cómo funcionan los puntos finales nativos de contenedores de Meta y cómo publicar de forma programática usando cURL, TypeScript o una API de publicación unificada.

Una API en lugar de la fontanería de la Graph API. InvisibleAPI es una sola API basada en jobs para Instagram y X. Conecta la cuenta, crea un job de publicación y consúltalo hasta que llegue a published.

Obtener clave API

Qué es la API de Instagram

La API de Instagram es la interfaz oficial de Meta para el software que trabaja con cuentas profesionales de Instagram. Forma parte de la Graph API de Meta, por eso los desarrolladores también la llaman Instagram Graph API. Esto es lo que cubre en 2026:

Pregunta Respuesta
¿Qué cuentas? Solo cuentas profesionales (Business o Creator). Los perfiles personales no pueden publicar a través de la API
¿Qué puede publicar? Imágenes individuales, carruseles de hasta 10 elementos y vídeos, que se publican como Reels
¿Qué más puede hacer? Leer estadísticas de la cuenta y de las publicaciones, y gestionar comentarios
¿Cómo se inicia sesión? Dos vías: inicio de sesión de Instagram (sin página de Facebook) o inicio de sesión de Facebook (requiere una página de Facebook vinculada)
¿Cuánto cuesta? Meta no publica ninguna tarifa de uso. El coste es el trabajo de desarrollo y revisión, que explicamos en nuestra guía de precios de la API de Instagram
¿Hay un límite de publicaciones? 100 publicaciones mediante API por cuenta en una ventana móvil de 24 horas. Un carrusel cuenta como una
Versión actual Graph API v26.0, publicada el 29 de julio de 2026

El resto de esta guía trata la parte de publicación: la configuración, el flujo de contenedores, las reglas de los archivos multimedia y código que funciona.

Meta cambia la plataforma a menudo. Nuestra página mensual de novedades de Instagram recoge cada cambio y si llega a la API.

Requisitos previos: Configuración de cuenta y tokens

Antes de escribir una sola línea de código de publicación, Meta requiere tres pasos de configuración administrativa. Omitir cualquiera de ellos provocará errores de permisos ((#100) Invalid parameter o (#200) Permission denied) durante las llamadas a la API.

1. El requisito de cuenta profesional

Los perfiles personales de Instagram no pueden publicar contenido a través de la API. La cuenta debe convertirse en una cuenta profesional de Instagram (Business o Creator). Puedes realizar este cambio dentro de la aplicación móvil de Instagram en Configuración > Tipo de cuenta y herramientas, o a través de Meta Business Suite.

2. Elegir una vía de inicio de sesión (y cuándo necesitas una página de Facebook)

Meta ofrece dos formas de acceder a los mismos endpoints de publicación:

Con el inicio de sesión de Facebook, vincula las cuentas desde la configuración de tu página de Facebook, en Cuentas vinculadas y después Instagram. Si ese vínculo falta o está incompleto, la Graph API no devolverá un identificador de usuario de Instagram (ig-user-id) para tu token. Los permisos del siguiente paso son los que usa la vía de inicio de sesión de Facebook.

3. Permisos de aplicación y tokens de acceso necesarios

Tu aplicación de desarrollador de Meta necesita los siguientes permisos para publicar contenido:

Para desarrollo, puedes generar un token de corta duración con el Graph API Explorer. Para sistemas de producción, intercambia ese token por un token de acceso de usuario de larga duración de 60 días, o implementa Facebook Login con OAuth 2.0 para solicitar permisos dinámicamente.

Cómo funciona la publicación nativa en Meta: El flujo de contenedores en 3 pasos

Meta separa la publicación de contenido en tres pasos distintos porque el procesamiento multimedia requiere tiempo. En lugar de mantener una conexión HTTP abierta mientras Instagram descarga, valida y transcodifica un vídeo o imagen de alta resolución, la API utiliza un ciclo de contenedores.

Paso Método HTTP y Endpoint Qué hace
1. Crear contenedor POST /{ig-user-id}/media Envía la URL del archivo y el pie de foto; crea un contenedor de subida
2. Consultar estado GET /{container-id}?fields=status_code Comprueba si Meta ha terminado de descargar y procesar
3. Publicar contenedor POST /{ig-user-id}/media_publish Publica el contenedor verificado en el perfil activo de Instagram

Paso 1: Crear el contenedor multimedia

Comienzas enviando una petición POST al endpoint /media de la cuenta. Proporcionas la URL de la imagen, el pie de foto y tu token de acceso.

curl -X POST "https://graph.facebook.com/v21.0/$IG_USER_ID/media" \
  -F "image_url=https://cdn.example.com/images/spring-launch.jpg" \
  -F "caption=Spring collection is live. Shop the link in bio." \
  -F "access_token=$META_ACCESS_TOKEN"

Si la carga útil es válida, Meta devuelve un ID de contenedor:

{
  "id": "17895695634123456"
}

Este contenedor todavía no es visible en Instagram. Es un objeto de retención temporal en los servidores de Meta.

Paso 2: Consultar el estado del contenedor

Antes de publicar, debes verificar que Meta ha terminado de procesar el archivo. Consulta el campo status_code del contenedor:

curl -X GET "https://graph.facebook.com/v21.0/$CONTAINER_ID?fields=status_code&access_token=$META_ACCESS_TOKEN"

Meta devuelve uno de cuatro estados:

Para imágenes, el estado suele pasar a FINISHED en menos de dos segundos. Para vídeos, el procesamiento puede tardar entre 15 y 45 segundos según el tamaño del archivo y la carga del servidor.

Paso 3: Publicar el contenedor

Una vez que el estado alcanza FINISHED, activa la llamada final de publicación pasando el ID del contenedor como creation_id al endpoint /media_publish:

curl -X POST "https://graph.facebook.com/v21.0/$IG_USER_ID/media_publish" \
  -F "creation_id=$CONTAINER_ID" \
  -F "access_token=$META_ACCESS_TOKEN"

Meta devuelve el ID del objeto multimedia publicado en Instagram:

{
  "id": "17923485729987654"
}
El ciclo de contenedores de Meta en 3 pasos: validación previa, creación de contenedor, consulta de estado y publicación.
El ciclo de contenedores de Meta en 3 pasos: validación previa, creación de contenedor, consulta de estado y publicación.

La publicación ya está activa en el perfil de Instagram de la cuenta.

Restricciones multimedia: URLs públicas, formatos y Reels

La API de publicación de contenido de Meta impone restricciones técnicas específicas en los archivos multimedia que suministras.

Solo URLs HTTPS públicas

Meta no acepta subidas directas de archivos binarios al crear contenedores multimedia. Tu aplicación debe subir la imagen o vídeo a un almacenamiento de objetos (como Amazon S3, Cloudflare R2 o una CDN pública) y pasar esa URL a Meta.

La URL debe cumplir tres requisitos:

  1. Debe ser accesible mediante HTTPS.
  2. No debe requerir encabezados de autenticación ni cookies privadas.
  3. El servidor debe devolver encabezados Content-Type correctos (image/jpeg o video/mp4).

Especificaciones de imagen y relaciones de aspecto

Los vídeos se publican como Reels

Cada subida de vídeo individual enviada a través de la API de publicación de contenido se publica como un Instagram Reel. El formato de vídeo clásico del feed se unificó con Reels en toda la plataforma.

Los carruseles requieren contenedores secundarios

Publicar un carrusel con múltiples imágenes o vídeos añade un nivel adicional de anidamiento de contenedores:

  1. Crea un contenedor secundario para cada imagen o vídeo individual indicando is_carousel_item=true.
  2. Consulta cada contenedor secundario hasta que todos ellos informen FINISHED.
  3. Crea un contenedor principal con media_type=CAROUSEL y pasa una matriz de IDs de contenedores secundarios en el parámetro children.
  4. Publica el contenedor principal en /media_publish.

Los carruseles admiten entre 2 y 10 elementos y pueden combinar imágenes y vídeos en la misma publicación.

La ruta de trabajo único: Publicar con InvisibleAPI

Construir y mantener el ciclo nativo de contenedores en múltiples cuentas introduce una sobrecarga considerable: almacenamiento de tokens, rutinas de renovación, asignación de páginas de Facebook, orquestación de contenedores secundarios y bucles de sondeo.

InvisibleAPI proporciona un motor de publicación social unificado. En lugar de coordinar flujos de contenedores de múltiples pasos por plataforma, envías un único trabajo de publicación asíncrono.

POST /api/v1/organizations/{organization}/publishing/jobs -> 202 Accepted

La plataforma valida la carga útil antes del envío, crea los contenedores necesarios, supervisa el progreso de procesamiento y gestiona los errores transitorios automáticamente.

El ciclo de vida del trabajo

Cuando envías una solicitud de publicación, InvisibleAPI devuelve un objeto de trabajo asíncrono inmediatamente:

{
  "id": "job_01JH8M5V9W2Q4K7X1P0R",
  "status": "processing",
  "clientRequestId": "blog-announcement-2026-09-21",
  "targets": ["acct_ig_8f29c41a"]
}

El trabajo avanza por estados documentados: pending, processing, submitted y polling, hasta que alcanza un estado terminal:

Sobre los ejemplos de API. targets, mediaItems, caption, clientRequestId y los valores de estado del trabajo son campos documentados de la plataforma. Las estructuras exactas de respuesta y los encabezados de autenticación en estos ejemplos ilustran el flujo de integración. Consulta la Guía de inicio rápido para conocer los detalles completos del esquema.

Ejemplos de código: Imágenes, Reels y Carruseles

A continuación se muestra cómo publicar diferentes tipos de contenido multimedia utilizando TypeScript limpio y sin dependencias externas.

Ejemplo 1: Publicar una sola imagen (cURL y TypeScript)

En primer lugar, la petición cURL directa para enviar una publicación de imagen individual:

curl -X POST "https://api.invisibleapi.ai/api/v1/organizations/$ORG_ID/publishing/jobs" \
  -H "Authorization: Bearer $INVISIBLE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "targets": ["acct_ig_8f29c41a"],
    "caption": "Exploring the coast. Photo taken at sunset.",
    "mediaItems": [
      {
        "mediaType": "image",
        "sourceUrl": "https://cdn.example.com/photos/coast-sunset.jpg"
      }
    ],
    "clientRequestId": "sunset-post-001"
  }'

En TypeScript, puedes encapsular el envío del trabajo y la consulta de estado en una función limpia:

interface PublishResult {
  jobId: string;
  status: string;
}

export async function publishInstagramImage(
  orgId: string,
  targetAccountId: string,
  imageUrl: string,
  caption: string,
  clientRequestId: string
): Promise<PublishResult> {
  const apiKey = process.env.INVISIBLE_API_KEY;

  // 1. Submit the asynchronous publishing job
  const response = await fetch(
    `https://api.invisibleapi.ai/api/v1/organizations/${orgId}/publishing/jobs`,
    {
      method: "POST",
      headers: {
        "Authorization": `Bearer ${apiKey}`,
        "Content-Type": "application/json",
      },
      body: JSON.stringify({
        targets: [targetAccountId],
        caption,
        mediaItems: [{ mediaType: "image", sourceUrl: imageUrl }],
        clientRequestId,
      }),
    }
  );

  if (!response.ok) {
    throw new Error(`Job creation failed: ${response.statusText}`);
  }

  const job = await response.json();
  return { jobId: job.id, status: job.status };
}

Ejemplo 2: Publicar un Reel de vídeo

Publicar un Reel solo requiere cambiar mediaType a video y proporcionar una URL de MP4. Como el procesamiento de vídeo requiere más tiempo, el bucle de sondeo comprueba el estado del trabajo hasta que pasa a published:

export async function publishInstagramReel(
  orgId: string,
  targetAccountId: string,
  videoUrl: string,
  caption: string,
  clientRequestId: string
) {
  const apiKey = process.env.INVISIBLE_API_KEY;

  const res = await fetch(
    `https://api.invisibleapi.ai/api/v1/organizations/${orgId}/publishing/jobs`,
    {
      method: "POST",
      headers: {
        "Authorization": `Bearer ${apiKey}`,
        "Content-Type": "application/json",
      },
      body: JSON.stringify({
        targets: [targetAccountId],
        caption,
        mediaItems: [{ mediaType: "video", sourceUrl: videoUrl }],
        clientRequestId,
      }),
    }
  );

  if (!res.ok) {
    throw new Error(`Job creation failed: ${res.status} ${await res.text()}`);
  }

  const job = await res.json();
  return pollUntilComplete(orgId, job.id);
}

const TERMINAL_STATUSES = new Set([
  "published",
  "partial_failure",
  "failed",
  "action_required",
  "canceled",
]);

async function pollUntilComplete(orgId: string, jobId: string, maxAttempts = 20) {
  const apiKey = process.env.INVISIBLE_API_KEY;

  for (let i = 0; i < maxAttempts; i++) {
    await new Promise((resolve) => setTimeout(resolve, 3000));

    const pollRes = await fetch(
      `https://api.invisibleapi.ai/api/v1/organizations/${orgId}/publishing/jobs/${jobId}`,
      { headers: { "Authorization": `Bearer ${apiKey}` } }
    );
    if (!pollRes.ok) {
      throw new Error(`Job lookup failed: ${pollRes.status}`);
    }
    const data = await pollRes.json();

    if (TERMINAL_STATUSES.has(data.status)) {
      return data;
    }
  }

  throw new Error("Job polling timed out before reaching a terminal state.");
}

Ejemplo 3: Publicar un carrusel

Para publicar un carrusel, pasa varios objetos dentro de mediaItems. Puedes combinar imágenes y vídeos en la misma petición:

export async function publishInstagramCarousel(
  orgId: string,
  targetAccountId: string,
  items: Array<{ type: "image" | "video"; url: string }>,
  caption: string,
  clientRequestId: string
) {
  const apiKey = process.env.INVISIBLE_API_KEY;

  const response = await fetch(
    `https://api.invisibleapi.ai/api/v1/organizations/${orgId}/publishing/jobs`,
    {
      method: "POST",
      headers: {
        "Authorization": `Bearer ${apiKey}`,
        "Content-Type": "application/json",
      },
      body: JSON.stringify({
        targets: [targetAccountId],
        caption,
        mediaItems: items.map((item) => ({
          mediaType: item.type,
          sourceUrl: item.url,
        })),
        clientRequestId,
      }),
    }
  );

  return response.json();
}

Internamente, la API genera de forma automática los contenedores secundarios para cada elemento, espera a que todos completen el procesamiento, crea el contenedor principal de carrusel y ejecuta la publicación final.

Fiabilidad en producción: Idempotencia, límites de frecuencia y fallos

Llevar la publicación social a entornos de producción exige protegerse contra interrupciones de red y agotamiento de límites.

Evitar publicaciones duplicadas con clientRequestId

Las conexiones de red fallan. Si una petición agota el tiempo de espera mientras espera la respuesta del servidor, un cliente básico reintentará la llamada. Sin una garantía de idempotencia, ese reintento crea una publicación duplicada en el feed del usuario.

InvisibleAPI admite un parámetro opcional clientRequestId (de hasta 128 caracteres). Si tu aplicación envía una petición con un clientRequestId que coincide con un trabajo recibido previamente, el servidor devuelve el registro del trabajo existente en lugar de enviar un duplicado:

# Safe retry with identical clientRequestId
curl -X POST "https://api.invisibleapi.ai/api/v1/organizations/$ORG_ID/publishing/jobs" \
  -H "Authorization: Bearer $INVISIBLE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "targets": ["acct_ig_8f29c41a"],
    "caption": "Product launch details.",
    "mediaItems": [{"mediaType": "image", "sourceUrl": "https://cdn.example.com/p1.jpg"}],
    "clientRequestId": "product-launch-v1"
  }'

Si el contenido de la petición difiere para una clave existente, la API devuelve un error 409 publishing.idempotency_mismatch, alertándote de una discrepancia en la carga útil.

Límites de frecuencia y cuotas de la plataforma

Meta aplica un límite estricto en la publicación: 100 publicaciones mediante API en una ventana móvil de 24 horas por cuenta de Instagram.

Si tu aplicación supera este umbral, Meta devuelve el código 9 con el subcódigo 2207042, y su recomendación es reintentar al día siguiente. Controla tu volumen de envíos a nivel local para distribuir las publicaciones en varios días si gestionas flujos de trabajo de publicación frecuente.

Clasificación de fallos: Errores del emisor frente a caídas de la plataforma

Cuando una publicación falla, saber quién es responsable de la corrección determina cómo debe reaccionar tu sistema:

Si implementas los reintentos tú mismo, nuestra guía de códigos de error de la API de Instagram clasifica cada código documentado en reintentar, corregir, escalar o detener. Para programar publicaciones desde tu propio código, descubre cómo automatizar publicaciones en Instagram con una cola y una política de fallos.

Para más detalles sobre los umbrales de la plataforma, revisa cómo funcionan los límites y restricciones de cuenta en Instagram o consulta cómo una plantilla de límites de publicación en redes sociales gestiona las esperas.

Pasos siguientes para tu integración

Publicar en Instagram de forma programática se reduce a gestionar el ciclo de vida de los contenedores. Si estás construyendo una integración personalizada para una sola cuenta, los endpoints de la Graph API de Meta proporcionan un control directo sobre las tres etapas de contenedores.

Si estás desarrollando una aplicación, herramienta interna o agente de IA que publica en múltiples cuentas, gestionar tokens, contenedores secundarios y clasificación de errores en tu propio código resulta complejo rápidamente, y ese es el trabajo del que se encarga la API de publicación en Instagram. A continuación, lee nuestra guía sobre cómo conectar una cuenta de Instagram o copia nuestra plantilla de calendario de publicación en redes sociales.

Publica en X y en Instagram desde una sola API.

Conecta las cuentas una vez, crea un job de publicación y consúltalo hasta que quede publicado. La validación previa detecta una publicación inválida antes de que llegue a la plataforma, y un clientRequestId hace que los reintentos sean seguros.

Fuentes

Preguntas frecuentes

¿Qué es la API de Instagram?
La API de Instagram es la interfaz oficial de Meta para el software que trabaja con cuentas profesionales de Instagram. Publica imágenes, carruseles y Reels, lee estadísticas y gestiona comentarios. Forma parte de la Graph API de Meta, y las cuentas personales no pueden usarla.
¿Necesitas una página de Facebook para usar la API de Instagram?
Solo si accedes con inicio de sesión de Facebook. Meta ofrece dos vías de acceso: la API de Instagram con inicio de sesión de Instagram, que no necesita página de Facebook, y la API de Instagram con inicio de sesión de Facebook, que requiere que la cuenta profesional esté vinculada a una página de Facebook.
¿La API de Instagram es gratuita?
Meta no publica ninguna tarifa de uso para la API de Instagram. Los costes reales son el trabajo de configuración y revisión, el alojamiento de tus archivos en URLs públicas y el tiempo de ingeniería para gestionar tokens, contenedores, límites y fallos.
¿Se pueden subir archivos de imagen o vídeo directamente a la API de Instagram?
No. La API de publicación de contenido de Meta no acepta subidas directas multipart/form-data al crear una publicación. Los archivos deben estar alojados en una URL HTTPS pública con encabezados MIME válidos para que los servidores de Meta descarguen el archivo directamente.
¿Por qué Meta utiliza un flujo de 3 pasos con contenedores para publicar?
Instagram procesa, redimensiona y codifica los archivos multimedia antes de publicar. Dado que la codificación de vídeo y la transcodificación de imágenes llevan tiempo, Meta separa el proceso en tres pasos: crear un contenedor, consultar su estado y publicar el contenedor.
¿Los vídeos subidos a través de la API se publican como publicaciones estándar o como Reels?
Cada vídeo individual publicado a través de la API de publicación de contenido se publica automáticamente como un Instagram Reel. El formato clásico de vídeo en el feed fue unificado con Reels en toda la plataforma.
¿Cuál es el límite diario de publicaciones de la API de Instagram?
Meta aplica un límite de 100 publicaciones por cuenta profesional de Instagram en una ventana móvil de 24 horas. Una publicación de carrusel con múltiples imágenes o vídeos cuenta como una sola publicación para este límite.
Etiquetas: #API de publicación

¿Listo para comenzar con InvisibleAPI?

Empieza a construir con InvisibleAPI hoy.

Publicaciones relacionadas

Ver todos los artículos

Mejores APIs de redes sociales para desarrolladores en 2026

Las mejores APIs de redes sociales para desarrolladores en 2026, agrupadas por función: APIs oficiales, de publicación unificada, reseñas y UGC, fichas locales y datos.

Novedades de Instagram: nuevas funciones de octubre de 2026

Todas las novedades de Instagram de julio a octubre de 2026 en una lista: qué cambió, quién lo recibe y si puedes usarlo con la API de Instagram. Se actualiza cada mes.

Alternativas a Ayrshare: 5 APIs de redes sociales

Alternativas a Ayrshare: 5 APIs de redes sociales

Compara las mejores alternativas a Ayrshare para desarrolladores en 2026. Análisis de precios, arquitectura multiinquilino, soporte MCP y fiabilidad.