Publicar Post
Publica, programa, responde a un post o crea un hilo en redes sociales.
Publica, programa, responde a un post o crea un hilo en redes sociales.
/api/v1/post/publishPublica, programa, responde a un post o crea un hilo.
{
"accountId": "<accountId>",
"text": "Tu contenido aquí",
"media": ["<mediaUrl>"],
"publishAt": "2027-01-20T12:00:00Z"
}{
"accountId": "<accountId>",
"text": "Tu contenido aquí",
"media": ["<mediaUrl>"],
"publishAt": "2027-01-20T12:00:00Z"
}| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
accountId | string | Sí | ID de la cuenta social conectada |
text | string | Condicional | Texto del post. Requerido si no hay media |
media | array | Condicional | URLs públicas u objetos con URL, MIME y metadatos de tamaño/duración/resolución; según el tipo de post |
publishAt | string | null | No | Fecha ISO 8601 para programar. null o ausente = publicar ahora |
timezone | string | No | Override IANA opcional. Sin él se utiliza la zona del workspace. |
replyTo | string | No | ID externo del post al que responder. Disponible en X y Threads; no es un ID interno de dopost |
thread | object[] | No | Posts consecutivos ordenados. Disponible en X, Threads y Mastodon. Ver Respuestas e hilos |
platformOptions | object | No | Opciones específicas de plataforma. Ver Opciones de plataforma |
Al menos uno de text o media debe proporcionarse, excepto en eventos y ofertas de Google Business.
{
"success": true,
"jobId": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"postId": "cm3abc123def456",
"status": "processing",
"threadPosts": 1,
"message": "Post accepted and processing. Use get_post with postId to check the final publishing result."
}{
"success": true,
"jobId": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"postId": "cm3abc123def456",
"status": "processing",
"threadPosts": 1,
"message": "Post accepted and processing. Use get_post with postId to check the final publishing result."
}La publicación es asíncrona. Usa el postId con el endpoint Obtener Post para comprobar el resultado.
Usa replyTo para responder a un post existente de X o Threads. Debe contener el ID externo asignado por la red social, no el postId interno devuelto por dopost.
{
"accountId": "<xAccountId>",
"text": "Una respuesta publicada con dopost",
"replyTo": "<externalPlatformPostId>"
}{
"accountId": "<xAccountId>",
"text": "Una respuesta publicada con dopost",
"replyTo": "<externalPlatformPostId>"
}Usa thread para publicar una cadena ordenada de respuestas en X, Threads o Mastodon. Los campos text y media del nivel principal crean el primer post; cada elemento de thread responde al anterior.
{
"accountId": "<xAccountId>",
"text": "Primer post del hilo",
"thread": [
{ "text": "Segundo post" },
{
"text": "Tercer post con media",
"media": ["<mediaUrl>"]
}
]
}{
"accountId": "<xAccountId>",
"text": "Primer post del hilo",
"thread": [
{ "text": "Segundo post" },
{
"text": "Tercer post con media",
"media": ["<mediaUrl>"]
}
]
}Campo de thread | Tipo | Requerido | Descripción |
|---|---|---|---|
text | string | Sí | Texto del post consecutivo |
media | array | No | Hasta cuatro URLs públicas de media para este post |
Un hilo puede contener entre 1 y 20 posts consecutivos. También se aplican los límites de contenido de cada plataforma. En X y Threads puedes combinar replyTo y thread para responder a un post existente y continuar con una cadena nueva.
Para programar un post para más tarde, pasa una fecha ISO 8601 futura en el campo publishAt:
{
"accountId": "<accountId>",
"text": "¡Post programado!",
"publishAt": "2027-01-20T12:00:00Z"
}{
"accountId": "<accountId>",
"text": "¡Post programado!",
"publishAt": "2027-01-20T12:00:00Z"
}La fecha publishAt debe ser futura. Las fechas pasadas devolverán un error 400.
Pasa un array de URLs accesibles públicamente:
{
"accountId": "<accountId>",
"text": "¡Mira esto!",
"media": ["<mediaUrl>", "<mediaUrl>"]
}{
"accountId": "<accountId>",
"text": "¡Mira esto!",
"media": ["<mediaUrl>", "<mediaUrl>"]
}Los tipos de media se detectan automáticamente desde la extensión de la URL. Los formatos soportados dependen de la plataforma de destino — usa el endpoint de Límites para verificar.
Telegram acepta hasta 10 archivos JPEG, PNG, WebP o MP4 por post. Los mensajes de solo texto permiten 4096 caracteres; los captions con medios permiten 1024 caracteres. Las fotos pueden ocupar hasta 10 MB y los vídeos MP4 hasta 50 MB.
Instagram y LinkedIn tienen dos tipos de conexión cada uno (INSTAGRAM / INSTAGRAM_DIRECT, LINKEDIN / LINKEDIN_ORGANIZATION). Usa el valor de plataforma de Listar Cuentas para saber cuál aplica a tu cuenta conectada.
Algunas plataformas aceptan configuración adicional mediante el campo opcional platformOptions. Todas las propiedades son opcionales — si se omiten se aplican los valores por defecto.
| Opción | Tipo | Por defecto | Descripción |
|---|---|---|---|
postType | string | "feed" | "feed" | "story" | "reel". Se establece automáticamente como "carousel" cuando hay varios elementos de media. |
shareToFeed | boolean | Comportamiento legacy del proveedor si se omite | Solo para postType: "reel". Usa true para mostrar el Reel en Feed y Reels, o false para mostrarlo solo en Reels. Los vídeos de Feed siempre usan true. |
Un feed, reel o story seleccionado explícitamente admite un único elemento. Las peticiones con varios elementos deben usar carousel; dopost rechaza tipos explícitos incompatibles en lugar de publicar silenciosamente solo el primero. Los Reels ya programados que no contienen shareToFeed conservan el comportamiento anterior del proveedor.
| Opción | Tipo | Predeterminado | Descripción |
|---|---|---|---|
pin | boolean | false | Fija el mensaje publicado o el primer mensaje de un álbum. El bot debe tener permiso para fijar mensajes. |
| Opción | Tipo | Por defecto | Descripción |
|---|---|---|---|
privacyLevel | string | "PUBLIC_TO_EVERYONE" | "PUBLIC_TO_EVERYONE" | "MUTUAL_FOLLOW_FRIENDS" | "FOLLOWER_OF_CREATOR" | "SELF_ONLY" |
disableDuet | boolean | false | Impedir que otros creen duetos |
disableStitch | boolean | false | Impedir que otros incluyan tu vídeo en stitch |
disableComment | boolean | false | Deshabilitar comentarios en el vídeo |
discloseContent | boolean | false | Marcar la publicación como contenido promocional o de marca |
isYourBrand | boolean | false | Al declarar contenido, indicar que promociona tu propia marca |
isBrandedContent | boolean | false | Al declarar contenido, indicar que promociona una marca de terceros |
Cuando discloseContent sea true, establece al menos uno de isYourBrand o isBrandedContent como true. Las restricciones de privacidad de la cuenta de TikTok siguen siendo aplicables.
| Opción | Tipo | Por defecto | Descripción |
|---|---|---|---|
videoType | string | "video" | "video" | "short" |
title | string | Primeros 100 caracteres de text | Título del vídeo |
privacyStatus | string | "public" | "public" | "private" | "unlisted" |
| Opción | Tipo | Por defecto | Descripción |
|---|---|---|---|
board | string | "" | ID del tablero donde publicar el pin. Requerido para Pinterest. |
Usa una ubicación de Google Business conectada como accountId. Las actualizaciones estándar admiten hasta 1.500 caracteres y una imagen; las publicaciones de galería no contienen texto.
| Opción | Tipo | Descripción |
|---|---|---|
postType | string | "standard" | "event" | "offer" | "media" |
ctaType | string | "book" | "order" | "shop" | "learn_more" | "sign_up" | "call" |
ctaUrl | string | URL HTTP(S) pública. Obligatoria salvo para call, que no acepta URL |
eventTitle | string | Obligatorio para eventos y ofertas |
eventStart, eventEnd | string | Fechas ISO obligatorias; sin zona se utiliza la del workspace |
couponCode | string | Código de cupón opcional para una oferta |
redeemOnlineUrl | string | URL HTTP(S) pública de canje opcional |
termsConditions | string | Condiciones opcionales de la oferta |
mediaCategory | string | Categoría de galería; por defecto ADDITIONAL |
Las ofertas no admiten un CTA independiente. dopost gestiona la programación y envía la publicación a Google cuando llega publishAt.
{
"accountId": "<idCuentaUbicacionGoogleBusiness>",
"text": "Ven a nuestra degustación del fin de semana",
"media": ["https://cdn.example.com/degustacion.jpg"],
"publishAt": "2027-01-20T10:00:00",
"platformOptions": {
"postType": "event",
"eventTitle": "Degustación del fin de semana",
"eventStart": "2027-01-23T17:00:00",
"eventEnd": "2027-01-23T20:00:00",
"ctaType": "book",
"ctaUrl": "https://example.com/reservar"
}
}{
"accountId": "<idCuentaUbicacionGoogleBusiness>",
"text": "Ven a nuestra degustación del fin de semana",
"media": ["https://cdn.example.com/degustacion.jpg"],
"publishAt": "2027-01-20T10:00:00",
"platformOptions": {
"postType": "event",
"eventTitle": "Degustación del fin de semana",
"eventStart": "2027-01-23T17:00:00",
"eventEnd": "2027-01-23T20:00:00",
"ctaType": "book",
"ctaUrl": "https://example.com/reservar"
}
}Usa Listar Comunidades de X para consultar las Comunidades guardadas de una cuenta de X y pasa el communityId seleccionado:
| Opción | Tipo | Por defecto | Descripción |
|---|---|---|---|
communityId | string | — | ID de una Comunidad guardada, ID numérico o URL de Comunidad en x.com |
shareWithFollowers | boolean | true | Distribuye también la misma publicación de la Comunidad entre los seguidores de la cuenta |
{
"accountId": "<xAccountId>",
"text": "Actualización para la Comunidad",
"platformOptions": {
"communityId": "1493446837214187523",
"shareWithFollowers": false
}
}{
"accountId": "<xAccountId>",
"text": "Actualización para la Comunidad",
"platformOptions": {
"communityId": "1493446837214187523",
"shareWithFollowers": false
}
}Las publicaciones de Comunidad no se pueden combinar con replyTo. La cuenta debe pertenecer a la Comunidad seleccionada y tener permiso para publicar en ella.
| Estado | Error | Causa |
|---|---|---|
400 | accountId is required | Falta el campo accountId |
400 | text or media is required | No se proporcionó ni text ni media |
400 | publishAt must be a valid future ISO date | Fecha inválida o en el pasado |
400 | replyTo must be a platform post ID | ID externo vacío, inválido o demasiado largo |
400 | thread must contain between 1 and 20 posts | Hilo vacío o con demasiados posts |
400 | thread is supported only for X, Threads, and Mastodon | Se solicitó un hilo para una plataforma no compatible |
400 | Invalid payload | El contenido no cumple los requisitos de la plataforma |
401 | Invalid or missing API key | Cabecera x-api-key incorrecta o ausente |
403 | API key does not have permission for this action | La API key no tiene el scope necesario para este endpoint |
404 | Account not found or inactive | El ID de cuenta no existe o está desconectada |
429 | Monthly post limit reached | Se ha superado la cuota mensual de publicaciones de tu plan. Mejora tu plan o espera al siguiente ciclo de facturación |
429 | Rate limit exceeded | Demasiadas peticiones. Revisa las cabeceras X-RateLimit-* y reintenta tras el tiempo indicado |
Selecciona una plataforma para ver una petición completa con sus opciones específicas y comentarios inline:
const res = await fetch("https://dopost.co/api/v1/post/publish", {
method: "POST",
headers: {
"x-api-key": "<apiKey>",
"Content-Type": "application/json",
},
body: JSON.stringify({
accountId: "<accountId>",
text: "Tu caption aquí",
media: [
{ url: "https://ejemplo.com/imagen.jpg", alt: "Descripción de la imagen" },
],
platformOptions: {
postType: "feed", // "feed" | "story" | "reel". Varias imágenes → "carousel" automáticamente
},
}),
});const res = await fetch("https://dopost.co/api/v1/post/publish", {
method: "POST",
headers: {
"x-api-key": "<apiKey>",
"Content-Type": "application/json",
},
body: JSON.stringify({
accountId: "<accountId>",
text: "Tu caption aquí",
media: [
{ url: "https://ejemplo.com/imagen.jpg", alt: "Descripción de la imagen" },
],
platformOptions: {
postType: "feed", // "feed" | "story" | "reel". Varias imágenes → "carousel" automáticamente
},
}),
});Las fechas y horas sin zona (2027-01-20T10:00:00) se interpretan en la zona horaria IANA del workspace. No hace falta indicarla. Las fechas con Z u offset explícito conservan su instante; dopost hace la conversión y guarda UTC. Una hora local inexistente por cambio de horario se rechaza. Para distinguir dos horas repetidas, incluye un offset explícito.
En publicación y reprogramación puedes enviar timezone como override IANA opcional, por ejemplo Europe/Madrid. En recurrentes, timezone selecciona la zona de la serie y de la fecha inicial; por defecto es la del workspace. Al actualizar una serie se conserva su zona actual. recurrence.endDate representa la fecha de calendario de fin de la serie.
event y offer necesitan eventTitle, eventStart y eventEnd; texto e imagen son opcionales. El final debe ser posterior al inicio; el evento puede haber empezado antes de publicar. standard necesita texto o una imagen. Los tipos standard, event y offer admiten una imagen JPG/PNG y no admiten vídeo en esta integración.
media publica en la galería: un JPG/PNG o MP4, sin texto ni CTA. PROFILE y COVER solo admiten fotos; LOGO es un alias obsoleto de PROFILE. Las descripciones de portada se omiten. Una foto PROFILE aceptada actualiza el avatar de la cuenta en dopost.
La API valida después de resolver los metadatos reales de Media. Los errores conocidos devuelven 400 con issues; una URL externa sin metadatos sigue sujeta a las comprobaciones de Google. 202 significa aceptado por dopost. Consulta el post para conocer el resultado y providerStatus: un recurso aceptado por Google puede seguir en PROCESSING y aún no ser visible.
Consulta la guía de Google Business y los límites.