Σύνδεση Ξεκινήστε δωρεάν δοκιμή

Ανακτήστε τα άρθρα σας.
Δημοσιεύστε τα με τον δικό σας τρόπο.

Κάθε άρθρο που γράφουμε για εσάς μπορεί να διαβαστεί μέσω HTTP: ο τίτλος, τα μεταδεδομένα, το Markdown, το HTML, η κύρια εικόνα και το FAQ. Περάστε τα στο Next.js, Astro ή προσαρμοσμένο site σας όταν εκτελείται το build, δημοσιεύστε τα και πείτε μας τη διεύθυνση στην οποία κατέληξε το καθένα.

Ένα bearer token. JSON in, JSON out. Κανένα SDK για εγκατάσταση και τίποτα για ρύθμιση πέρα από ένα κλειδί.

Το webhook κάνει push. Το API σάς επιτρέπει να κάνετε pull.

Μεταφέρουν το ίδιο άρθρο με την ίδια μορφή, οπότε ένας parser γραμμένος για το ένα διαβάζει το άλλο χωρίς αλλαγές. Η διαφορά είναι ποιος ξεκινά την επικοινωνία.

Το webhook, όταν ο ιστότοπός σας μπορεί να δέχεται ανάρτηση οποιαδήποτε ώρα

Καλούμε το endpoint σας τη στιγμή που ένα άρθρο είναι έτοιμο και ξανά όταν αλλάζει. Τίποτα για poll, τίποτα για προγραμματισμό. WordPress, Shopify, Ghost, ένα trigger του Zapier ή ένα route που γράψατε εσείς.

Το API, όταν ο ιστότοπός σας δημιουργείται και αναπτύσσεται ως ενιαία μονάδα

Ένα static site δεν μπορεί να δεχτεί μια ανάρτηση στις έξι και μισή το πρωί, πρέπει πρώτα να γίνει rebuild. Έτσι το build σας ζητά τι περιμένει, το παίρνει και μετά μας λέει τη διεύθυνση. Εσείς επιλέγετε πότε.

Και τα δύο, αν τα θέλετε

Είναι ξεχωριστές συνδέσεις και καμία δεν αποκλείει την άλλη. Ένα webhook που τροφοδοτεί ένα newsletter και ένα API που τροφοδοτεί τον ιστότοπο είναι μια συνηθισμένη διάταξη.

Ένα κλειδί, που αποστέλλεται ως bearer token.

Δημιουργήστε ένα κλειδί στο dashboard, στην ενότητα Settings και μετά Connections. Εμφανίζεται μία φορά, όταν δημιουργείται, επειδή αποθηκεύεται μόνο το hash του: αν το χάσετε, ανακαλέστε το και δημιουργήστε άλλο. Ένα κλειδί διαβάζει κάθε ιστότοπο του λογαριασμού και ανακαλείται από την ίδια οθόνη.

Κάθε αίτημα

Authorization: Bearer sns_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Accept: application/json

Ελέγξτε ότι λειτουργεί

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
}

Όριο ρυθμού

120 αιτήματα το λεπτό, με καταμέτρηση στο κλειδί και όχι στη διεύθυνση από την οποία προέρχεται, επειδή οι build runners μοιράζονται διευθύνσεις. Πάνω από αυτό λαμβάνετε 429 με τις τυπικές κεφαλίδες Retry-After και X-RateLimit. Η λήψη άρθρων για ένα build είναι λίγα μόνο αιτήματα, οπότε δεν είναι όριο που θα πρέπει να φτάσετε κατά λάθος.

Κρατήστε το κλειδί έξω από το repository σας

Διαβάζει ό,τι έχουμε γράψει για τον λογαριασμό σας, συμπεριλαμβανομένων άρθρων που δεν έχουν ακόμη δημοσιευτεί. Βάλτε το στο build environment σας, όχι στον πηγαίο κώδικά σας. Ανακαλέστε το εδώ αμέσως μόλις βρεθεί κάπου που δεν πρέπει, και οτιδήποτε το χρησιμοποιεί θα λάβει αμέσως 401.

Πέντε συνολικά, και τα τέσσερα είναι μόνο για ανάγνωση.

Όλα βρίσκονται κάτω από το /api/v1/. Η έκδοση είναι στη διαδρομή από την πρώτη μέρα, ώστε μια v2 να μπορεί κάποτε να υπάρξει χωρίς να χαλάσει ό,τι γράφετε σήμερα.

GET /api/v1/me

Ο λογαριασμός στον οποίο ανήκει το κλειδί, καθώς και το όνομα και το πρόθεμα του ίδιου του κλειδιού. Χρήσιμο πάνω απ’ όλα για ένα πράγμα: να σας δείχνει ότι το κλειδί σε αυτό το περιβάλλον είναι το κλειδί που νομίζετε ότι είναι.

Παράδειγμα

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

Κάθε ιστότοπος στον λογαριασμό. Το id είναι αυτό με το οποίο φιλτράρει η λίστα άρθρων, και το domain υπάρχει ώστε ένα build script να ταιριάζει με κάτι που ήδη γνωρίζει αντί να μεταφέρει ένα id.

Παράδειγμα

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

Μια σελίδα άρθρων, με πρώτη τη νεότερη αλλαγή, χωρίς το κείμενο. Η σειρά βασίζεται στο πότε άλλαξε τελευταία φορά κάθε άρθρο και όχι στο πότε γράφτηκε, γι’ αυτό το updated_since είναι χρήσιμο: ένα άρθρο που είναι ήδη δημοσιευμένο μπορεί να τροποποιηθεί αργότερα, όταν προστεθεί ή αφαιρεθεί ένας σύνδεσμος.

Παράμετροι ερωτήματος

Όνομα Τι κάνει
site_id Ένας ιστότοπος, από το /sites. Ένα id που δεν ανήκει στον λογαριασμό σας απαντά με 404.
status Ένα από τα draft, qa, needs_repair, review, ready, published, failed. Οτιδήποτε άλλο επιστρέφει 422 αντί για κενή σελίδα. Το "ready" είναι αυτό που θέλει ένα build: γραμμένο, ελεγμένο και όχι ακόμη δημοσιευμένο κάπου.
updated_since ISO 8601, όπως 2026-09-06T00:00:00Z. Θυμηθείτε το timestamp της τελευταίας εκτέλεσής σας και περάστε το ξανά στην επόμενη.
per_page Έως 100. Η προεπιλογή είναι 25.
page Από το 1. Το meta.has_more λέει αν πρέπει να ζητήσετε άλλο.

Παράδειγμα

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}

Ένα άρθρο, με όλα όσα αφήνει έξω η λίστα: content_markdown, content_html, το FAQ ως schema.org JSON-LD έτοιμο να προστεθεί στη σελίδα και τυχόν exchange links που περιέχει το άρθρο.

Τα ονόματα πεδίων είναι επίτηδες αυτά που στέλνει το webhook μας. Αν έχετε ήδη δέκτη webhook, ο ίδιος parser διαβάζει και αυτό.

Παράδειγμα

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

Εσείς δημοσιεύετε το άρθρο, εδώ μας δηλώνετε τη διεύθυνση. Είναι το μοναδικό endpoint που αλλάζει οτιδήποτε.

Κάνει ακριβώς ό,τι κάνει και μια παράδοση που κάναμε εμείς οι ίδιοι: το άρθρο σημειώνεται ως δημοσιευμένο, προσμετράται στο μηνιαίο όριό σας, το στοιχείο του πλάνου κλείνει, τυχόν exchange links μέσα του λαμβάνουν τη διεύθυνση που περιμένει ο verifier και ενημερώνεται η Facebook Page σας αν έχετε συνδέσει μία. Χωρίς αυτή την κλήση το άρθρο παραμένει έτοιμο για πάντα και τίποτα από αυτά δεν συμβαίνει.

Παράδειγμα

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"}'

Απαντήσεις

200 Καταγράφηκε. Το άρθρο επιστρέφει με τη νέα του κατάσταση, το published_at και το published_url.
422 Το url λείπει ή δεν είναι πλήρης διεύθυνση http:// ή https://.
409 Το άρθρο δεν είναι έτοιμο για δημοσίευση ή έχει ήδη καταγραφεί ως δημοσιευμένο. Το άρθρο επιστρέφεται μαζί με την απόρριψη, ώστε να μπορείτε να δείτε ποιο από τα δύο ισχύει.

Συνδέστε το "REST API" ως μηχανισμό δημοσίευσης.

Στις Ρυθμίσεις και μετά στη Δημοσίευση, υπάρχει ένας μηχανισμός με όνομα "REST API: εσείς κάνετε fetch και publish". Δεν ζητά τίποτα, γιατί δεν υπάρχει κάτι να στείλουμε. Αυτό που αλλάζει είναι τι συμβαίνει κάθε πρωί: ένα ολοκληρωμένο άρθρο παραμένει έτοιμο χωρίς διεύθυνση και η οθόνη δημοσίευσης λέει ότι περιμένει να το κάνετε fetch, αντί να εμφανίζει μια αποστολή που απέτυχε.

Μπορείτε να χρησιμοποιείτε το API χωρίς να το συνδέσετε: τα endpoints λειτουργούν για κάθε λογαριασμό με κλειδί. Η σύνδεσή του είναι ο τρόπος με τον οποίο το υπόλοιπο προϊόν καταλαβαίνει ότι πρέπει να σταματήσει να περιμένει δική του διεύθυνση, και είναι αυτό που εμποδίζει ένα άρθρο που δημοσιεύετε εσείς να μετρηθεί ως αποτυχία.

Κάθε αποτυχία είναι JSON με ένα μήνυμα.

Μία ενιαία μορφή παντού, είτε η απόρριψη προήλθε από τον έλεγχο του κλειδιού είτε από τον validator, ώστε να μη χρειάζεται τίποτα να κάνει parse δύο.

{ "message": "That API key is not valid, or it has been revoked." }
Κατάσταση Τι σημαίνει
401 Δεν υπάρχει κλειδί, το κλειδί δεν είναι δικό μας ή το κλειδί έχει ανακληθεί.
404 Δεν υπάρχει τέτοιο άρθρο ή ιστότοπος σε αυτόν τον λογαριασμό. Άρθρο άλλου λογαριασμού απαντά με 404 και όχι με 403: ένα API που λέει "αυτό δεν είναι δικό σας" έχει επιβεβαιώσει ότι το αντικείμενο υπάρχει.
409 Το αίτημα ήταν σωστό, αλλά το άρθρο δεν είναι σε κατάλληλη κατάσταση για αυτό.
422 Λείπει μια παράμετρος ή είναι λανθασμένη. Η απάντηση περιλαμβάνει ένα αντικείμενο errors με το όνομα του πεδίου, καθώς και το μήνυμα.
429 Πάνω από το όριο ρυθμού. Το Retry-After λέει πόσο πρέπει να περιμένετε.

Τι κάνει πραγματικά ένα βήμα build.

#!/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

Δημιουργήστε ένα κλειδί και δοκιμάστε το.

Η δοκιμαστική περίοδος αρκεί για να διαβάζετε το API: τα άρθρα που γράφονται κατά τη διάρκειά της είναι πραγματικά άρθρα και επιστρέφονται μέσω αυτών των endpoints όπως όλα τα άλλα.

Ξεκινήστε δωρεάν δοκιμή