GET
/api/v1/me
Le compte auquel la clé appartient, ainsi que le nom et le préfixe de la clé. Cela sert avant tout à vous indiquer que la clé dans cet environnement est bien celle que vous pensez.
Exemple
curl https://seonis.ai/api/v1/me \
-H "Authorization: Bearer $SEONIS_API_KEY"
GET
/api/v1/sites
Chaque site du compte. L’id est ce sur quoi la liste des articles filtre, et le domaine est là pour qu’un script de build puisse faire la correspondance avec quelque chose qu’il connaît déjà plutôt que de transporter un id.
Exemple
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
Une page d’articles, changement le plus récent d’abord, sans le contenu. Triée selon la date de dernière modification de chaque article plutôt que selon sa date d’écriture, ce qui donne son intérêt à updated_since : un article déjà en ligne peut être modifié plus tard, lorsqu’un lien y est ajouté ou retiré.
Paramètres de requête
| Nom |
Ce que cela fait |
| site_id |
Un site, depuis /sites. Un id qui n’est pas sur votre compte renvoie 404. |
| status |
L’un de draft, qa, needs_repair, review, ready, published, failed. Toute autre valeur renvoie une 422 plutôt qu’une page vide. "ready" est ce qu’un build veut : écrit, vérifié et encore publié nulle part. |
| updated_since |
ISO 8601, par exemple 2026-09-06T00:00:00Z. Conservez l’horodatage de votre dernière exécution et renvoyez-le lors de la suivante. |
| per_page |
Jusqu’à 100. La valeur par défaut est 25. |
| page |
À partir de 1. meta.has_more indique s’il faut en demander une autre. |
Exemple
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 article, avec tout ce que la liste laisse de côté : content_markdown, content_html, la FAQ en schema.org JSON-LD prête à être insérée dans la page, et tous les liens d’échange que l’article contient.
Les noms de champs sont ceux que notre webhook envoie, volontairement. Si vous avez déjà un récepteur de webhook, le même parseur lit ceci.
Exemple
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
Vous mettez l’article en ligne ; c’est ici que vous nous indiquez l’adresse. C’est le seul point de terminaison qui modifie quoi que ce soit.
Cela fait exactement ce qu’une livraison effectuée par nous-mêmes fait : l’article est marqué comme publié, il est compté dans votre quota mensuel, l’élément du plan est clôturé, tous les liens d’échange qu’il contient reçoivent l’adresse que le vérificateur attendait, et votre Page Facebook est informée si vous en avez connecté une. Sans cet appel, l’article reste prêt pour toujours et rien de tout cela ne se produit.
Exemple
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"}'
Réponses
| 200 |
Enregistré. L’article revient avec son nouveau statut, published_at et published_url. |
| 422 |
L’url est manquante ou n’est pas une adresse complète en http:// ou https://. |
| 409 |
L’article n’est pas prêt à être publié, ou est déjà enregistré comme publié. L’article revient avec le refus, afin que vous puissiez voir lequel des deux cas s’applique. |