Skip to main content
GET
/
articles
List Articles
curl --request GET \
  --url https://api.example.com/articles

Endpoints

GET /articles
GET /posts                                 # backward-compatible alias
GET /collections/:collection-slug/items    # for specific enabled collections
Plan note:
  • Articles are available on all plans.
  • Additional non-article collections require the Authority plan.

Query parameters

ParameterTypeDefaultDescription
pageinteger1Page number
per_pageinteger10Items per page (max 100)
statusstringpublishedStatus filter (published, draft, scheduled, all)
searchstring-Search in title, excerpt, or content
categoriesstring-Comma-separated category IDs
tagsstring-Comma-separated tag IDs
authorsstring-Comma-separated author IDs
orderbystringdateSort field (date, created_at, updated_at, title, slug, id)
orderstringdescSort direction (asc, desc)
_fieldsstring-Comma-separated list of response attributes to return
includestring-Include related resources (categories,tags,authors)

Example request (root articles)

curl "https://api.skayle.ai/v1/ORG_ID/articles?status=published&page=1&per_page=2&include=categories,tags,authors&orderby=date&order=desc"

Example request (collection items)

curl "https://api.skayle.ai/v1/ORG_ID/collections/answers/items?status=published&page=1&per_page=20"

Example response

{
  "data": [
    {
      "id": "post_01HZX2...",
      "type": "articles",
      "attributes": {
        "title": "B2B SaaS Content Strategy for 2026",
        "slug": "b2b-saas-content-strategy-2026",
        "excerpt": "A practical framework for demand capture and category coverage.",
        "content": "...",
        "content_html": "<h2>...</h2>",
        "comparison_screenshots": [
          {
            "section_heading": "Acme vs Competitor A",
            "section_slug": "acme-vs-competitor-a",
            "competitor_name": "Competitor A",
            "source_url": "https://competitor-a.com/",
            "screenshot_url": "https://cdn.example.com/comparison-screenshots/org/post/acme-vs-competitor-a.webp",
            "captured_at": "2026-02-25T13:02:11.000Z",
            "status": "captured"
          }
        ],
        "status": "published",
        "word_count": 1860,
        "seo_title": "B2B SaaS Content Strategy for 2026",
        "meta_description": "Framework for planning and publishing ranking-focused content.",
        "featured_image_url": "https://cdn.example.com/hero.jpg",
        "faq": [],
        "schema_json_ld": {},
        "publish_at": "2026-02-01T00:00:00.000Z",
        "created_at": "2026-01-28T12:15:01.000Z",
        "updated_at": "2026-02-01T09:20:11.000Z",
        "edited_at": null
      },
      "relationships": {
        "categories": {
          "data": [{ "type": "categories", "id": "cat_01HZX..." }]
        },
        "tags": {
          "data": [{ "type": "tags", "id": "tag_01HZX..." }]
        },
        "authors": {
          "data": [{ "type": "authors", "id": "author_01HZX..." }]
        }
      },
      "links": {
        "self": "/v1/ORG_ID/articles/post_01HZX2..."
      }
    }
  ],
  "included": [
    {
      "id": "cat_01HZX...",
      "type": "categories",
      "attributes": {
        "name": "Content Strategy",
        "slug": "content-strategy"
      }
    }
  ],
  "links": {
    "self": "/v1/ORG_ID/articles?page=1&per_page=2",
    "prev": null,
    "next": "/v1/ORG_ID/articles?page=2&per_page=2"
  },
  "meta": {
    "total": 42,
    "per_page": 2,
    "page": 1
  }
}

Notes

  • status defaults to published for list requests.
  • status=scheduled is supported.
  • Legacy scheduled rows represented as draft + publish_at are returned as scheduled.
  • status=draft excludes those legacy scheduled rows.
  • categories, tags, and authors filters are ID-based.
  • /posts is backward-compatible, but new integrations should use /articles.

Response field descriptions

FieldTypeDescription
data[].idstringUnique article/item ID
data[].typestringResource type (articles for root feed, items for non-article collections)
data[].attributes.titlestringContent title
data[].attributes.slugstringURL slug
data[].attributes.excerptstring | nullShort summary
data[].attributes.contentstringMain content body
data[].attributes.content_htmlstring | nullRendered HTML content
data[].attributes.comparison_screenshotsarrayCompetitor screenshot metadata for comparison sections
data[].attributes.statusstringContent status
data[].attributes.word_countnumber | nullWord count
data[].attributes.faqarrayFAQ items
data[].attributes.schema_json_ldobject | nullJSON-LD schema payload
data[].attributes.created_atstringISO datetime
data[].attributes.updated_atstringISO datetime
data[].relationshipsobjectLinked category/tag/author references
included[]arrayIncluded resources requested by include
meta.totalnumberTotal matching rows
meta.per_pagenumberPage size
meta.pagenumberCurrent page

Filtering behavior

  • search matches title, excerpt, and content text.
  • categories, tags, and authors accept comma-separated IDs.
  • Multiple taxonomy filters are combined so results match all active filter groups.
  • Comparison posts may include embedded screenshot images in content_html and structured screenshot metadata in comparison_screenshots.

Pagination

Pagination metadata is returned in meta and navigation links in links. Use page and per_page to page through results.

Error responses

Organization not found

{
  "errors": [
    {
      "status": "404",
      "title": "Not Found",
      "detail": "Organization with ID \"ORG_ID\" not found"
    }
  ]
}

API not available for this connector mode

{
  "errors": [
    {
      "status": "403",
      "title": "Forbidden",
      "detail": "This organization's content is not available via API. Skayle CMS mode must be enabled."
    }
  ]
}

Collection not found or disabled

{
  "errors": [
    {
      "status": "404",
      "title": "Not Found",
      "detail": "Collection not found or not enabled"
    }
  ]
}