Endpoints
Publicar un comentario
Publica un comentario en Reddit desde una cuenta del parque de SubReply, detrás de un proxy residencial.
/api/v1/publish50 créditosEsta ruta publica de verdad en Reddit
r/testingground4bots, comprueba el enlace permanente que devuelve y solo después conecta la ruta en producción.Parámetros
Cuerpo de la petición (application/json)
| Parámetro | Tipo | Obligatorio | Descripción |
|---|---|---|---|
post_url | string | Obligatorio | URL completa de la publicación de Reddit bajo la que comentar. Debe empezar por https://www.reddit.com/ o https://reddit.com/. |
comment | string | Obligatorio | Texto del comentario, de 10 a 2.000 caracteres. Por debajo de 10 no es un comentario — y un «ok» daña la credibilidad de la cuenta que lo publica. |
Ejemplo
curl -s -X POST https://subreply.io/api/v1/publish \
-H "Content-Type: application/json" \
-H "Authorization: Bearer sr_live_VOTRE_CLE_API" \
-d '{
"post_url": "https://www.reddit.com/r/startupfrance/comments/1abc23/...",
"comment": "J'\''ai monté mon cabinet il y a deux ans avec exactement le même problème..."
}'{
"status": "posted",
"reddit_comment_url": "https://www.reddit.com/r/startupfrance/comments/1abc23/_/xyz789",
"account_used": "subreply_community",
"credits_used": 50,
"credits_remaining": 450
}{
"status": "queued",
"reddit_comment_url": null,
"account_used": "subreply_community",
"credits_used": 0,
"credits_remaining": 500
}202: no reintentes
202 significa que la petición ha salido pero que la publicación no está confirmada. No se descuenta nada — y sobre todo, no repitas la llamada: puede que el comentario ya esté publicado y pondrías un segundo. Comprueba la publicación antes de cualquier nuevo intento.Cómo funciona
Selección de una cuenta del parque
SubReply elige una cuenta de Reddit activa, con sesión válida y la menos solicitada del parque — para que el tráfico de la API nunca recaiga sobre una sola cuenta.
503 y no descuenta nada.Proxy residencial
La sesión sale detrás de una IP residencial fija, asociada a la cuenta. Una misma cuenta conserva su IP de una publicación a otra, como un usuario real.
Publicación mediante navegador
Un Chrome real abre la publicación y escribe el comentario, con pausas y un ritmo de escritura humanos. No se usa ninguna API oficial de Reddit.
Étape 1
Selección de una cuenta del parque
503 y no descuenta nada.Protección frente al shadowban
- Cuentas aged: cuentas reales con historial y karma, no cuentas creadas a demanda.
- Comportamiento humano simulado: navegación real, pausas variables, escritura progresiva.
- Rotación de cuentas: publica primero la menos solicitada, y el parque absorbe el volumen en vez de concentrarlo.
Facturación
Los 50 créditos se descuentan tras la confirmación de la publicación, nunca al enviar. En concreto:
200con enlace permanente → se cobra.202,422,503→ ningún cargo.- Repetición sobre la misma
post_url→credits_used: 0, el cargo es idempotente por publicación. Ojo: eso protege de un doble cargo, no de un doble comentario en Reddit.
Errores propios de esta ruta
| Código | Causa | Qué hacer |
|---|---|---|
503 | Servicio de publicación no disponible: ninguna cuenta con la que publicar, o el servicio no responde. | Reintentar en 60 s. No se ha cobrado nada y, si el comentario sí había salido, el cargo idempotente protege del doble pago. |
422 | Rechazo funcional: publicación bloqueada, archivada o eliminada, subreddit en solo lectura, o cuenta de Reddit temporalmente no disponible. | No reintentar igual — corregir. El mensaje de error recoge el motivo exacto que devolvió el servicio. |
La lista completa está en la página códigos de error.
Timeout del lado del cliente
Una llamada puede tardar hasta dos minutos. Ajusta el timeout de tu cliente HTTP a 180 segundos como mínimo: un timeout corto en el cliente corta la conexión sin anular la publicación, y pierdes el enlace permanente de un comentario que sí está publicado.
const response = await fetch("https://subreply.io/api/v1/publish", {
method: "POST",
headers: {
"Content-Type": "application/json",
Authorization: `Bearer ${process.env.SUBREPLY_API_KEY}`,
},
body: JSON.stringify({ post_url: postUrl, comment }),
// 3 minutes : la publication passe par un vrai navigateur.
signal: AbortSignal.timeout(180_000),
});