Blog

· 3 min de lectura

Cómo publicar en Bluesky con una API (y programarlo) en 10 líneas

Publica y programa en Bluesky desde tu app con una sola llamada REST. Sin registrar una app de desarrollador. Incluye cURL, JavaScript y Python.

Bluesky es una de las redes más fáciles de automatizar. No hay que registrar una app de desarrollador ni esperar en una cola de revisión. Aun así, «fácil» significa ocuparse de las sesiones, del formato de los records, de las facets de enlaces y menciones y de los blobs de imagen. Y Bluesky no tiene programación nativa.

Esta guía muestra cómo publicar y programar en Bluesky con una sola llamada REST usando Hapi. La misma petición puede publicar a la vez en X y en LinkedIn.

Paso 1: Crea una contraseña de aplicación en Bluesky

En Bluesky, entra en Ajustes → Privacidad y seguridad → Contraseñas de aplicación → Añadir contraseña de aplicación (en la interfaz en inglés: Settings → Privacy and security → App passwords → Add app password). Ponle un nombre como hapi y cópiala.

Una contraseña de aplicación no puede cambiar la contraseña de la cuenta ni eliminarla, así que es la credencial adecuada para dársela a una integración.

Paso 2: Conecta la cuenta en Hapi

Crea una cuenta de Hapi, abre Accounts → Connect → Bluesky y pega tu usuario y la contraseña de aplicación. Hapi cifra la credencial en reposo (AES-256-GCM) y nunca la devuelve al navegador.

Después crea una clave en API keys. Solo se muestra una vez, así que guárdala en el entorno:

bash
export HAPI_API_KEY="hapi_live_..."

Paso 3: Publica

cURL

bash
curl -X POST https://hapi.tools/v1/posts \
  -H "Authorization: Bearer $HAPI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "content": "Hello Bluesky, posted from an API 🦋",
    "platforms": ["bluesky"]
  }'

JavaScript

js
const res = await fetch("https://hapi.tools/v1/posts", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${process.env.HAPI_API_KEY}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    content: "Hello Bluesky, posted from an API 🦋",
    platforms: ["bluesky"],
  }),
});
console.log(await res.json());

Python

python
import os, requests

res = requests.post(
    "https://hapi.tools/v1/posts",
    headers={"Authorization": f"Bearer {os.environ['HAPI_API_KEY']}"},
    json={"content": "Hello Bluesky, posted from an API 🦋", "platforms": ["bluesky"]},
)
print(res.json())

Eso es todo. Recibes un 201 con la publicación y el estado de cada cuenta.

Paso 4: Prográmalo para más tarde

Bluesky no admite publicaciones programadas de forma nativa, así que lo habitual sería montar tú el proceso que las publica a la hora. Con Hapi basta con añadir scheduledAt:

json
{
  "content": "This goes out Monday morning",
  "platforms": ["bluesky"],
  "scheduledAt": "2026-11-16T09:00:00-03:00"
}

Hapi la publica a su hora y dispara un webhook firmado, post.published o post.failed, para que tu app sepa cómo terminó.

Paso 5: Publica en Bluesky, X y LinkedIn a la vez

La misma petición, con más plataformas:

json
{
  "content": "We just shipped v2 🚀",
  "platforms": ["bluesky", "x", "linkedin"],
  "platformOptions": {
    "bluesky": { "content": "We just shipped v2 🚀 (Bluesky gets the short version)" }
  }
}

platformOptions permite ajustar el texto de cada red. Viene bien porque Bluesky corta las publicaciones en 300 caracteres.

Que un reintento no publique dos veces

La conexión a veces falla. Envía un encabezado Idempotency-Key y Hapi devuelve la publicación original en lugar de crear un duplicado:

bash
-H "Idempotency-Key: release-v2-announcement"

Esto importa todavía más cuando quien llama a la API es un agente de IA.

Lo que te ahorras al no construirlo tú

  • Crear y renovar la sesión contra el AT Protocol
  • Montar a mano las facets de enlaces y menciones
  • Subir blobs de imagen y adjuntarlos a los records
  • La programación, los reintentos y los avisos de fallo

Empieza tu prueba de 15 días → La prueba de 5 USD incluye 5 cuentas conectadas y 300 publicaciones durante 15 días.