Iniciar sesión Iniciar prueba gratuita

Obtenga sus artículos.
Publíquelos a su manera.

Todos los artículos que escribimos para usted pueden leerse por HTTP: el título, los metadatos, el Markdown, el HTML, la imagen principal y las preguntas frecuentes. Llévelos a su sitio Next.js, Astro o personalizado cuando se ejecute su compilación, publíquelos y díganos en qué dirección terminó cada uno.

Un token bearer. JSON de entrada, JSON de salida. No hay ningún SDK que instalar ni nada que configurar aparte de una clave.

El webhook envía. La API le permite recuperar.

Llevan el mismo artículo con la misma estructura, así que un analizador escrito para uno lee el otro sin cambios. La diferencia es quién inicia la conversación.

El webhook, cuando su sitio puede aceptar una publicación a cualquier hora

Llamamos a su endpoint en el momento en que un artículo está listo, y de nuevo cuando cambia. Nada que consultar, nada que programar. WordPress, Shopify, Ghost, un disparador de Zapier o una ruta que usted mismo escribió.

La API, cuando su sitio se compila y se despliega como una unidad

Un sitio estático no puede aceptar una publicación a las seis y media de la mañana; antes algo tiene que recompilarse. Así que su compilación pregunta qué está esperando, lo toma y después nos dice la dirección. Usted elige cuándo.

Ambos, si los quiere

Son conexiones independientes y ninguna excluye a la otra. Un webhook que alimenta un boletín y una API que alimenta el sitio web es una configuración normal.

Una clave, enviada como token bearer.

Cree una clave en el panel, en Settings y luego en Connections. Se muestra una sola vez, cuando se crea, porque solo se guarda su hash: si la pierde, revóquela y cree otra. Una clave lee todos los sitios de la cuenta y se revoca desde la misma pantalla.

Cada solicitud

Authorization: Bearer sns_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Accept: application/json

Compruebe que funciona

curl https://seonis.ai/api/v1/me \
  -H "Authorization: Bearer $SEONIS_API_KEY"
{
  "organisation": { "id": 12, "name": "Peppervale", "country": "GB" },
  "key": {
    "name": "Production build",
    "prefix": "sns_live_ab",
    "created_at": "2026-09-06T09:12:44+00:00",
    "last_used_at": "2026-09-06T09:31:02+00:00"
  },
  "sites": 2
}

Límite de velocidad

120 solicitudes por minuto, contadas por clave y no por la dirección de la que vienen, porque los ejecutores de compilación comparten direcciones. Si supera eso, recibirá 429 con las cabeceras estándar Retry-After y X-RateLimit. Obtener artículos para una compilación son unas pocas solicitudes, así que no es un límite con el que deba encontrarse por accidente.

Mantenga la clave fuera de su repositorio

Lee todo lo que hemos escrito para su cuenta, incluidos los artículos que aún no están publicados. Póngala en su entorno de compilación, no en su código fuente. Revóquela aquí en cuanto esté en algún lugar donde no debería estar, y cualquier cosa que la use recibirá un 401 de inmediato.

Cinco en total, y cuatro solo leen.

Todo está bajo /api/v1/. La versión está en la ruta desde el primer día, así que un día puede existir una v2 sin romper lo que escriba hoy.

GET /api/v1/me

La cuenta a la que pertenece la clave, y el nombre y prefijo de la propia clave. Útil sobre todo para una cosa: indicarle que la clave de este entorno es la clave que usted cree que es.

Ejemplo

curl https://seonis.ai/api/v1/me \
  -H "Authorization: Bearer $SEONIS_API_KEY"
GET /api/v1/sites

Todos los sitios de la cuenta. El id es lo que usa la lista de artículos para filtrar, y el dominio está ahí para que un script de compilación pueda coincidir con algo que ya conoce en lugar de llevar un id.

Ejemplo

curl https://seonis.ai/api/v1/sites \
  -H "Authorization: Bearer $SEONIS_API_KEY"
{
  "sites": [
    {
      "id": 5,
      "name": "Peppervale",
      "domain": "peppervale.co.uk",
      "url": "https://peppervale.co.uk",
      "language": "en",
      "country": "GB",
      "market": "en-GB",
      "status": "active",
      "articles_published": 34,
      "created_at": "2026-06-02T11:04:19+00:00"
    }
  ]
}
GET /api/v1/articles

Una página de artículos, con el cambio más reciente primero, sin el texto. Se ordenan por la última vez que cambió cada artículo y no por cuándo se escribió, que es lo que hace útil updated_since: un artículo que ya está publicado puede editarse después, cuando se inserta un enlace o se vuelve a quitar.

Parámetros de consulta

Nombre Lo que hace
site_id Un sitio, desde /sites. Un id que no está en su cuenta responde con 404.
status Uno de draft, qa, needs_repair, review, ready, published, failed. Cualquier otro valor da un 422 en lugar de una página vacía. "ready" es lo que quiere una compilación: escrito, revisado y aún no publicado en ningún sitio.
updated_since ISO 8601, como 2026-09-06T00:00:00Z. Recuerde la marca de tiempo de su última ejecución y vuelva a enviarla en la siguiente.
per_page Hasta 100. El valor predeterminado es 25.
page Desde 1. meta.has_more indica si debe pedir otra.

Ejemplo

curl -G https://seonis.ai/api/v1/articles \
  -H "Authorization: Bearer $SEONIS_API_KEY" \
  -d site_id=5 \
  -d status=ready \
  -d updated_since=2026-09-01T00:00:00Z \
  -d per_page=50
{
  "articles": [
    {
      "id": 918,
      "site_id": 5,
      "language": "en",
      "status": "ready",
      "title": "How to choose a pepper grinder",
      "slug": "how-to-choose-a-pepper-grinder",
      "meta_title": "How to choose a pepper grinder | Peppervale",
      "meta_description": "Burr or blade, ceramic or steel: what matters in a grinder.",
      "meta_keywords": ["pepper grinder", "burr grinder"],
      "tags": ["Kitchen"],
      "excerpt": "A burr grinder gives an even grind; a blade one does not.",
      "key_takeaways": ["A burr grinder gives an even grind; a blade one does not."],
      "faq": [{ "question": "Ceramic or steel?", "answer": "Steel for pepper, ceramic for salt." }],
      "hero_image": { "url": "https://seonis.ai/storage/images/5/918.jpg", "alt": "A pepper grinder" },
      "infographic_url": null,
      "word_count": 1812,
      "published_url": null,
      "published_at": null,
      "updated_at": "2026-09-06T06:31:12+00:00",
      "created_at": "2026-09-05T02:14:55+00:00",
      "quality": { "seo_score": 88, "language_score": 96, "language_findings": [] }
    }
  ],
  "meta": { "page": 1, "per_page": 50, "total": 1, "last_page": 1, "has_more": false }
}
GET /api/v1/articles/{id}

Un artículo, con todo lo que la lista omite: content_markdown, content_html, las preguntas frecuentes como schema.org JSON-LD listas para insertar en la página, y cualquier enlace de intercambio que lleve el artículo.

Los nombres de los campos son los que envía nuestro webhook, a propósito. Si ya tiene un receptor de webhook, el mismo analizador procesa esto.

Ejemplo

curl https://seonis.ai/api/v1/articles/918 \
  -H "Authorization: Bearer $SEONIS_API_KEY"
{
  "article": {
    "id": 918,
    "site_id": 5,
    "language": "en",
    "status": "ready",
    "title": "How to choose a pepper grinder",
    "slug": "how-to-choose-a-pepper-grinder",
    "meta_description": "Burr or blade, ceramic or steel: what matters in a grinder.",
    "content_markdown": "Grinders differ.\n\n## Burr or blade\n\nA **burr** grinder ...",
    "content_html": "<p>Grinders differ.</p>\n<h2>Burr or blade</h2> ...",
    "faq_schema": { "@context": "https://schema.org", "@type": "FAQPage", "mainEntity": [] },
    "hero_image": { "url": "https://seonis.ai/storage/images/5/918.jpg", "alt": "A pepper grinder" },
    "word_count": 1812,
    "published_url": null,
    "updated_at": "2026-09-06T06:31:12+00:00",
    "quality": { "seo_score": 88, "language_score": 96, "language_findings": [] },
    "exchange_links": []
  }
}
POST /api/v1/articles/{id}/published

Usted publica el artículo; aquí es donde nos indica la dirección. Es el único endpoint que cambia algo.

Hace exactamente lo mismo que una entrega hecha por nosotros: el artículo se marca como publicado, cuenta para su cupo mensual, se cierra el elemento del plan, cualquier enlace de intercambio que contenga recibe la dirección que el verificador estaba esperando, y se avisa a su página de Facebook si ha conectado una. Sin esta llamada, el artículo se queda listo para siempre y nada de eso ocurre.

Ejemplo

curl -X POST https://seonis.ai/api/v1/articles/918/published \
  -H "Authorization: Bearer $SEONIS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"url": "https://peppervale.co.uk/blog/how-to-choose-a-pepper-grinder"}'

Respuestas

200 Registrado. El artículo vuelve con su nuevo estado, published_at y published_url.
422 Falta la URL o no es una dirección completa http:// o https://.
409 El artículo no está listo para publicarse, o ya figura como publicado. El artículo vuelve con el rechazo, para que pueda ver cuál es el caso.

Conecte "REST API" como su motor de publicación.

En Settings, luego en Publishing, hay un motor llamado "REST API: you fetch and publish". No pide nada, porque no hay nada que debamos enviar. Lo que cambia es lo que ocurre cada mañana: un artículo terminado queda listo sin dirección, y la pantalla de publicación indica que está esperando a que usted lo recupere en lugar de mostrar una entrega fallida.

Puede usar la API sin conectarla: los endpoints funcionan para cualquier cuenta con una clave. Conectarla es la forma en que el resto del producto sabe que debe dejar de esperar una dirección propia, y es lo que evita que un artículo que usted mismo publica se cuente como un fallo.

Todos los errores son JSON con un mensaje.

Una sola forma en todo momento, tanto si el rechazo viene de la comprobación de la clave como del validador, para que nada tenga que analizar dos.

{ "message": "That API key is not valid, or it has been revoked." }
Estado Lo que significa
401 No hay clave, la clave no es nuestra o la clave ha sido revocada.
404 No existe ese artículo o sitio en esta cuenta. Un artículo de otra cuenta responde con 404 en lugar de 403: una API que dice "eso no es suyo" ha confirmado que la cosa existe.
409 La solicitud era correcta, pero el artículo no está en un estado que lo permita.
422 Falta un parámetro o es incorrecto. La respuesta incluye un objeto errors con el nombre del campo, además del mensaje.
429 Se ha superado el límite de velocidad. Retry-After indica cuánto tiempo debe esperar.

Lo que realmente hace un paso de compilación.

#!/usr/bin/env bash
set -euo pipefail

# 1. What is finished and not yet on the site?
ready=$(curl -sG https://seonis.ai/api/v1/articles \
  -H "Authorization: Bearer $SEONIS_API_KEY" \
  -d site_id=5 -d status=ready -d per_page=100)

for id in $(echo "$ready" | jq -r '.articles[].id'); do
  # 2. Take the article, body and all.
  curl -s https://seonis.ai/api/v1/articles/$id \
    -H "Authorization: Bearer $SEONIS_API_KEY" \
    | jq -r '.article.content_markdown' > "content/posts/$id.md"

  # 3. Your build puts it live, and you know where it landed.
  slug=$(echo "$ready" | jq -r ".articles[] | select(.id==$id) | .slug")

  curl -s -X POST https://seonis.ai/api/v1/articles/$id/published \
    -H "Authorization: Bearer $SEONIS_API_KEY" \
    -H "Content-Type: application/json" \
    -d "{\"url\": \"https://peppervale.co.uk/blog/$slug\"}"
done

Cree una clave y pruébela.

La prueba es suficiente para usar la API en modo lectura: los artículos escritos durante ella son artículos reales, y vuelven por estos endpoints como cualquier otro.

Iniciar prueba gratuita