BestPost para desarrolladores

Con la API, tus programas y asistentes de IA trabajan en tu cuenta de BestPost: suben archivos multimedia, preparan publicaciones, piden que se creen textos y subtítulos, y programan. Lo que crean aparece al instante en tu Planificador y en tu Calendario.

La API está disponible en los planes Pro y Business.

1. Crear una clave

En BestPost, en Configuración, Cuenta, “API y MCP”. Una clave puede solo preparar publicaciones, o prepararlas y programarlas. Empieza por bp_ y solo se muestra una vez. Cada cuenta puede tener hasta 5 claves. Con una clave no se puede iniciar sesión, ni conectar un canal, ni cambiar la facturación.

curl https://bestpost.app/api/open/v1/me \
  -H "Authorization: Bearer $BESTPOST_API_KEY"

La respuesta muestra qué puede hacer la clave, cuánto has usado de tu plan y qué normas se aplican a tu cuenta.

2. Con Claude y otros asistentes (MCP)

Un asistente compatible con MCP puede usar BestPost como herramienta. Entonces le dices, por ejemplo: “Sube la carpeta Otoño como carrusel para Instagram y prográmalo para mañana a las 18:00”.

Sin instalar nada

La dirección del servidor MCP es https://bestpost.app/api/mcp. Añádela en tu asistente como servidor MCP (en la app de Claude se llama conector). Al conectarlo, inicias sesión en BestPost y confirmas lo que puede hacer el asistente. Para esto no necesitas ninguna clave.

Los asistentes conectados los ves y los desconectas en BestPost, en Configuración, Cuenta, “API y MCP”.

Si prefieres usar una clave, envíala como encabezado. En Claude Code, por ejemplo:

claude mcp add --transport http bestpost https://bestpost.app/api/mcp \
  --header "Authorization: Bearer $BESTPOST_API_KEY"

Esta vía no ve los archivos de tu dispositivo. Trabaja con archivos multimedia que ya están en BestPost o con direcciones públicas.

En tu propia computadora, con acceso a carpetas

Descarga el servidor como un único archivo. Necesita Node 20 o posterior.

curl -o bestpost-mcp.mjs https://bestpost.app/api/open/v1/mcp/bestpost-mcp.mjs

Después, añádelo a tu programa, por ejemplo a Claude Desktop o a Claude Code:

{
  "mcpServers": {
    "bestpost": {
      "command": "node",
      "args": ["/ruta/a/bestpost-mcp.mjs"],
      "env": { "BESTPOST_API_KEY": "bp_live_..." }
    }
  }
}

El servidor solo lee imágenes y videos, nada más de tu computadora.

3. Con tus propios programas (API)

Todas las direcciones empiezan por https://bestpost.app/api/open/v1. La clave va en el encabezado Authorization: Bearer …. Las horas, siempre con zona horaria.

Publicación a partir de un archivo

Un video, una imagen o de 2 a 35 imágenes como carrusel. La publicación se crea como borrador. Con Idempotency-Key, una solicitud repetida no crea nada dos veces. Los textos siguen la configuración fija de la marca: BestPost sustituye los guiones largos y medios, y los hashtags y emojis se eliminan si la marca está configurada en “ninguno”.

curl -X POST https://bestpost.app/api/open/v1/posts \
  -H "Authorization: Bearer $BESTPOST_API_KEY" \
  -H "Idempotency-Key: reel-2026-10-12" \
  -F "media=@video.mp4" \
  -F 'data={
    "platforms": {
      "instagram": { "text": "Nuevo en la tienda #nuevo", "firstComment": "Enlace en la bio" },
      "facebook":  { "text": "Nuevo en la tienda" }
    },
    "scheduledAt": "2026-10-12T18:00:00+02:00"
  }'

Publicación a partir de direcciones, programada al momento

En lugar de archivos, puedes usar direcciones https públicas. BestPost descarga los archivos multimedia por sí mismo. Con schedule, la publicación se programa en la misma llamada si todas sus plataformas lo permiten.

curl -X POST https://bestpost.app/api/open/v1/posts \
  -H "Authorization: Bearer $BESTPOST_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "mediaUrls": ["https://example.com/imagen-1.jpg", "https://example.com/imagen-2.jpg"],
    "platforms": { "instagram": { "text": "Dos imágenes, un carrusel" } },
    "scheduledAt": "2026-10-12T18:00:00+02:00",
    "schedule": true
  }'

Textos de BestPost

BestPost escucha y mira el archivo y escribe un texto para cada plataforma, además del título para YouTube y un primer comentario. Igual que en la app, cuenta como un texto de tu plan. Los textos son propuestas: léelos antes de programar.

# 1. solicitar
curl -X POST https://bestpost.app/api/open/v1/posts/POST_ID/texts -H "Authorization: Bearer $BESTPOST_API_KEY"
# 2. consultar hasta que "status" ya no sea "running"
curl https://bestpost.app/api/open/v1/posts/POST_ID/texts -H "Authorization: Bearer $BESTPOST_API_KEY"
# 3. escribir en el borrador (solo campos vacíos)
curl -X POST https://bestpost.app/api/open/v1/posts/POST_ID/texts/apply -H "Authorization: Bearer $BESTPOST_API_KEY"

Subtítulos

Primero créalos y revísalos; después, incrústalos. La incrustación no se puede deshacer y solo es posible una vez por video. Sin style, se aplica el estilo que guardaste en BestPost como predeterminado.

# 1. crear: la respuesta incluye los subtítulos en SRT
curl -X POST https://bestpost.app/api/open/v1/posts/POST_ID/subtitles -H "Authorization: Bearer $BESTPOST_API_KEY"
# 2. incrustar en el video, aquí con la palabra resaltada
curl -X POST https://bestpost.app/api/open/v1/posts/POST_ID/subtitles/burn \
  -H "Authorization: Bearer $BESTPOST_API_KEY" -H "Content-Type: application/json" \
  -d '{ "style": { "preset": "karaoke" } }'
# 3. consultar hasta que "status" sea "burned"
curl https://bestpost.app/api/open/v1/posts/POST_ID/subtitles -H "Authorization: Bearer $BESTPOST_API_KEY"

Programar

curl -X POST https://bestpost.app/api/open/v1/posts/POST_ID/schedule \
  -H "Authorization: Bearer $BESTPOST_API_KEY" -H "Content-Type: application/json" \
  -d '{ "scheduledAt": "2026-10-12T18:00:00+02:00" }'

Todas las direcciones

GET/meCuenta, permisos de la clave, uso del plan, normas
GET/channelsMarcas y canales conectados
GET/channels/{id}Lo que la plataforma permite ahora para este canal
GET/postsListar publicaciones
POST/postsCrear una publicación a partir de archivos o direcciones
GET/posts/{id}Leer una publicación
PATCH/posts/{id}Cambiar textos, hora, nombre y plataformas
DELETE/posts/{id}Eliminar una publicación
POST/posts/{id}/scheduleProgramar un borrador
POST/posts/{id}/unscheduleRetirar una publicación programada
POST/posts/{id}/textsPedir textos a BestPost
GET/posts/{id}/textsEstado y propuestas
POST/posts/{id}/texts/applyEscribir las propuestas en el borrador
POST/posts/{id}/subtitlesCrear subtítulos
GET/posts/{id}/subtitlesEstado, texto, progreso
PUT/posts/{id}/subtitlesGuardar los subtítulos corregidos
DELETE/posts/{id}/subtitlesDescartar los subtítulos
POST/posts/{id}/subtitles/burnIncrustar los subtítulos en el video

La descripción completa con todos los campos está disponible en formato OpenAPI: https://bestpost.app/api/open/v1/openapi.json

4. Normas

  • Nunca de inmediato. La hora más próxima posible es dentro de 10 minutos. Así todavía se puede deshacer un error.
  • TikTok y YouTube. Ambas exigen datos tuyos antes de cada publicación. Por eso, una publicación con una de estas plataformas sigue siendo un borrador (confirmInApp) hasta que la confirmes con un clic en el Planificador. Lo que se aplica a tu cuenta figura en rules, en la respuesta de /me.
  • Pinterest. Pinterest pide que elijas tú cada pin. Por eso, una publicación con Pinterest siempre sigue siendo un borrador hasta que la confirmes en el Planificador, donde también eliges el tablero. Un pin puede tener título, descripción y enlace (title, text, link). Pinterest no tiene primer comentario.
  • Tu plan también se aplica aquí. Los textos, los subtítulos, los borradores y el almacenamiento cuentan igual que en la app. /me devuelve el estado en usage.
  • Límite por canal y día. Un programa solo puede programar un número limitado de publicaciones por canal al día. Las cifras figuran en rules.maxPerChannelPerDay.
  • Los errores se explican. Cada rechazo incluye una frase y un código fijo:
{ "error": "X: “text” tiene 301 caracteres; se permiten 280.", "code": "TEXT_ZU_LANG" }

Se aplican las Condiciones de la API. Respondemos a tus preguntas en info@bestpost.app.