Crear publicación con la API
Publica o programa una publicación en múltiples plataformas con una sola llamada a la API, incluyendo contenido y medios.
https://post.adaptlypost.com/post/api/v1/social-postsCree una nueva publicación en redes sociales. Las publicaciones pueden publicarse inmediatamente, programarse para más tarde o guardarse como borradores.
posts.draft basta cuando saveAsDraft es true. Un scheduledAt futuro necesita posts.schedule. Sin scheduledAt, o con una hora ya pasada, se publica ahora y hace falta posts.publish. Por tanto, una clave de Colaborador solo puede guardar borradores.
Parámetros del cuerpo
| Parámetro | Tipo | Descripción |
|---|---|---|
platformsOBLIGATORIO | PlatformType[] | Plataformas objetivo (ej. TWITTER, LINKEDIN, INSTAGRAM). Cada una necesita también sus IDs de conexión |
contentTypeOBLIGATORIO | ContentType | TEXT, IMAGE, VIDEO, CAROUSEL o DOCUMENT. DOCUMENT es solo para LinkedIn: exactamente un archivo PDF, PPT, PPTX, DOC o DOCX en mediaUrls, mostrado como documento deslizable |
text | string | Contenido de texto de la publicación. En LinkedIn, menciona una página de empresa con @[Nombre de la página](urn:li:organization:<id>), escribiendo el nombre exactamente como lo muestra LinkedIn. LinkedIn solo permite mencionar páginas de empresa, no personas |
platformTexts | PlatformText[] | Textos personalizados por plataforma |
mediaUrls | string[] | URLs de archivos multimedia subidos |
mediaAltTexts | string[] | Texto alternativo de cada imagen, en el mismo orden que mediaUrls. Máximo 1000 caracteres cada uno; usa una cadena vacía para omitir una imagen. Se envía a X, Bluesky, Mastodon, LinkedIn, Facebook, Instagram y Threads. Pinterest usa el primero, recortado a 500 caracteres. TikTok, YouTube, el Perfil de Empresa de Google y los vídeos lo ignoran. |
thumbnailUrl | string | URL de miniatura para publicaciones de video |
thumbnailTimestampMs | number | Fotograma del video que se usa como miniatura, en milisegundos desde el inicio |
platformThumbnails | PlatformThumbnail[] | Una miniatura distinta para una plataforma de una publicación de video, como { platform, thumbnailUrl?, thumbnailTimestampMs? }. YOUTUBE, FACEBOOK, LINKEDIN y TELEGRAM aceptan una imagen, INSTAGRAM y PINTEREST una imagen o un fotograma, TIKTOK solo un fotograma. Las plataformas sin entrada usan thumbnailUrl y thumbnailTimestampMs |
platformAspectRatios | PlatformAspectRatio[] | Ajusta todas las imágenes de una publicación IMAGE o CAROUSEL a un formato en una plataforma, como { platform, aspectRatio, fit? }. Una entrada por plataforma. aspectRatio es SQUARE (1:1), PORTRAIT (4:5), VERTICAL (9:16) o LANDSCAPE (1.91:1): INSTAGRAM acepta SQUARE, PORTRAIT o LANDSCAPE, TIKTOK los cuatro. fit es CROP (por defecto, recorta desde el centro) o PAD (conserva la imagen entera y rellena el resto con una copia desenfocada). Otras plataformas, publicaciones de video, historias de Instagram y una segunda entrada para una plataforma devuelven un 400. Las plataformas sin entrada mantienen las imágenes tal como las subiste |
firstComments | PlatformFirstComment[] | Un comentario que se publica bajo la publicación ya publicada desde la misma cuenta, como { platform, text }. Una entrada por plataforma. LINKEDIN acepta hasta 1250 caracteres, TWITTER 280, THREADS 500, BLUESKY 300, MASTODON 500, YOUTUBE 10000 (no en videos privados ni creados para niños), FACEBOOK 8000 e INSTAGRAM 2200 (no en historias). Otras plataformas devuelven un 400. Una página de Facebook o una cuenta de Instagram conectada antes de que llegaran los primeros comentarios necesita reconectarse una vez; hasta entonces su comentario falla con firstCommentError |
threadReplies | PlatformThreadReplies[] | Convierte la publicación en un hilo, como { platform, texts }: la publicación lo abre y cada texto sale como respuesta al anterior, desde la misma cuenta. Una entrada por plataforma, hasta 25 textos. TWITTER admite 280 caracteres por respuesta (más con X Premium), THREADS 500, BLUESKY 300 y MASTODON 500 (o el límite de la instancia). Otras plataformas, una respuesta vacía o demasiado larga y una plataforma que también tiene primer comentario devuelven un 400 |
scheduledAt | string | Fecha en formato ISO 8601 para programación. Omita para publicar inmediatamente. |
timezoneOBLIGATORIO | string | Zona horaria IANA (ej. America/New_York) |
saveAsDraft | boolean | Guardar como borrador en lugar de publicar |
recurrence | Recurrence | Repite la publicación según un calendario. Necesita un scheduledAt futuro. Consulta Publicaciones recurrentes más abajo |
twitterConnectionIds | string[] | ID de conexión de cuentas de Twitter |
twitterKeepLinks | boolean | Mantiene clicables los enlaces del texto de X. Por defecto se rompe cada enlace del texto de X (example.com pasa a example. com), porque X cobra más de 10 veces más por un post con enlace. Solo las cuentas con lifetime deal de AppSumo pueden activarlo: un enlace mantenido cuesta 20 créditos en vez de 2, también en un primer comentario de X, y sin créditos suficientes el post de X falla. true devuelve un 400 en cualquier otro plan. Se ignora cuando el texto de X no tiene enlaces |
linkedinConnectionIds | string[] | ID de conexión de cuentas de LinkedIn |
instagramConnectionIds | string[] | ID de conexión de cuentas de Instagram |
tiktokConnectionIds | string[] | ID de conexión de cuentas de TikTok |
youtubeConnectionIds | string[] | ID de conexión de canales de YouTube |
pinterestConnectionIds | string[] | IDs de conexión de la cuenta de Pinterest |
blueskyConnectionIds | string[] | IDs de conexión de la cuenta de Bluesky |
mastodonConnectionIds | string[] | IDs de conexión de la cuenta de Mastodon |
googleBusinessConnectionIds | string[] | IDs de conexión de las ubicaciones del Perfil de Empresa de Google |
googleBusinessConfigs | GoogleBusinessConfig[] | Ajustes de publicación del Perfil de Empresa de Google por ubicación: tipo de publicación (novedad, evento u oferta), botón, fechas del evento y detalles de la oferta. Consulte Configuraciones de plataforma para el esquema |
tumblrConnectionIds | string[] | IDs de conexión de blogs de Tumblr |
telegramConnectionIds | string[] | IDs de conexión de canales y grupos de Telegram |
tumblrConfigs | TumblrConfig[] | Ajustes de Tumblr por blog: etiquetas, título y enlace de origen. Consulta Configuraciones de plataforma para el esquema |
threadsConnectionIds | string[] | IDs de conexión de la cuenta de Threads |
pageIds | string[] | Páginas de Facebook en las que publicar. Se acepta el id de la cuenta o el pageId de /social-accounts |
pinterestConfigs | PinterestConfig[] | Configuración de esta plataforma, un objeto por cuenta, cada uno con el connectionId al que se aplica (pageId en Facebook). Consulte Configuraciones de plataforma |
tiktokConfigs | TikTokConfig[] | Configuración de esta plataforma, un objeto por cuenta, cada uno con el connectionId al que se aplica (pageId en Facebook). Consulte Configuraciones de plataforma |
instagramConfigs | InstagramConfig[] | Configuración de esta plataforma, un objeto por cuenta, cada uno con el connectionId al que se aplica (pageId en Facebook). Consulte Configuraciones de plataforma |
facebookConfigs | FacebookConfig[] | Configuración de esta plataforma, un objeto por cuenta, cada uno con el connectionId al que se aplica (pageId en Facebook). Consulte Configuraciones de plataforma |
youtubeConfigs | YouTubeConfig[] | Configuración de esta plataforma, un objeto por cuenta, cada uno con el connectionId al que se aplica (pageId en Facebook). Consulte Configuraciones de plataforma |
linkedinConfigs | LinkedInConfig[] | Configuración de esta plataforma, un objeto por cuenta, cada uno con el connectionId al que se aplica (pageId en Facebook). Consulte Configuraciones de plataforma |
Texto específico por plataforma
Utilice platformTexts para personalizar el contenido por plataforma mientras comparte la misma publicación.
Una cuenta por plataforma
Solo se permite una cuenta por plataforma por publicación. Por ejemplo, no puede incluir dos IDs de conexión de Twitter en la misma solicitud. Esta restricción se aplica para cumplir con los Términos de Servicio de las plataformas. Violar esta regla devolverá un error 400.Publicaciones recurrentes
Añade un objeto recurrence para repetir la publicación. La publicación en scheduledAt es la primera de la serie y fija la hora del día, en la timezone que envíes. Solo existe la siguiente publicación de la serie. AdaptlyPost la crea unas 24 horas antes de que salga.
Objeto recurrence
| Parámetro | Tipo | Descripción |
|---|---|---|
frequencyOBLIGATORIO | RecurrenceFrequency | DAILY, WEEKLY, MONTHLY o YEARLY. YEARLY publica cada año en la misma fecha; una serie que empieza el 29 de febrero publica el 28 de febrero en los demás años |
interval | number | Repetir cada N días, semanas, meses o años (1-30, predeterminado: 1) |
weekdays | Weekday[] | Solo WEEKLY. Los días en que se publica, de MONDAY a SUNDAY. El día de la semana de scheduledAt siempre se incluye |
endsOn | string | Último día en que puede salir una publicación, en formato YYYY-MM-DD. Debe ser el día de la primera publicación o posterior. No se puede combinar con maxOccurrences |
maxOccurrences | number | Número total de publicaciones de la serie (2-365). No se puede combinar con endsOn. Sin ninguno de los dos, se repite hasta que pauses o elimines la serie |
Reglas de las publicaciones recurrentes
Una publicación recurrente no puede usar saveAsDraft: true ni incluir una cuenta de TikTok. Cualquiera de los dos devuelve 400. Las fechas que pasan mientras la serie está en pausa se omiten y nunca se publican tarde. X y LinkedIn rechazan un texto igual al de una publicación anterior, así que añade spintax como {Hi|Hello} para que cada publicación sea distinta.Cuando se rechaza una publicación
Una publicación rechazada por su contenido responde 400 con code post_validation_failed e issues, que enumera todos los problemas encontrados a la vez, con la misma forma que los issues de Comprobar publicación. message es el texto del problema cuando hay uno, y una lista de textos cuando hay varios.
{
"statusCode": 400,
"error": "Bad Request",
"code": "post_validation_failed",
"message": [
"Text exceeds maximum length for Twitter/X. Maximum is 280 characters",
"Video duration (185s) exceeds your TikTok account limit of 180 seconds"
],
"issues": [
{
"code": "TEXT_TOO_LONG",
"severity": "ERROR",
"message": "Text exceeds maximum length for Twitter/X. Maximum is 280 characters",
"platform": "TWITTER",
"connectionId": "conn_abc123"
},
{
"code": "TIKTOK_VIDEO_TOO_LONG",
"severity": "ERROR",
"message": "Video duration (185s) exceeds your TikTok account limit of 180 seconds",
"platform": "TIKTOK",
"connectionId": "conn_tt789"
}
]
}curl --request POST \
--url https://post.adaptlypost.com/post/api/v1/social-posts \
--header 'Authorization: Bearer <api-key>' \
--header 'Content-Type: application/json' \
--data '{
"platforms": ["TWITTER", "LINKEDIN"],
"contentType": "TEXT",
"text": "Exciting product update!",
"timezone": "America/New_York",
"twitterConnectionIds": ["conn_abc123"],
"linkedinConnectionIds": ["conn_def456"]
}'curl --request POST \
--url https://post.adaptlypost.com/post/api/v1/social-posts \
--header 'Authorization: Bearer <api-key>' \
--header 'Content-Type: application/json' \
--data '{
"platforms": ["LINKEDIN"],
"contentType": "TEXT",
"text": "{Hi|Hello} everyone, the weekly product tip is live!",
"scheduledAt": "2026-10-05T13:00:00Z",
"timezone": "America/New_York",
"linkedinConnectionIds": ["conn_def456"],
"recurrence": {
"frequency": "WEEKLY",
"weekdays": ["MONDAY", "THURSDAY"],
"maxOccurrences": 12
}
}'{
"postId": "post_xyz789",
"queuedPlatforms": ["TWITTER", "LINKEDIN"],
"skippedPlatforms": [],
"isScheduled": false,
"scheduledAt": null
}