Articles
Get Article / Item
Retrieve a single article or collection item by ID or slug.
GET
/
articles
/
:id-or-slug
Get Article / Item
curl --request GET \
--url https://api.example.com/articles/:id-or-slugimport requests
url = "https://api.example.com/articles/:id-or-slug"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://api.example.com/articles/:id-or-slug', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.example.com/articles/:id-or-slug",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.example.com/articles/:id-or-slug"
req, _ := http.NewRequest("GET", url, nil)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.example.com/articles/:id-or-slug")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/articles/:id-or-slug")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
response = http.request(request)
puts response.read_bodyEndpoints
GET /articles/:id-or-slug
GET /posts/:id-or-slug # backward-compatible alias
GET /collections/:collection-slug/items/:id-or-slug
Articlesare available on all plans.- Additional non-article collections require the
Authorityplan.
- Skayle content ID
- Content slug
Query parameters
| Parameter | Type | Description |
|---|---|---|
_fields | string | Comma-separated attribute field filter |
include | string | Include related resources (categories,tags,authors) |
Example request (root article)
curl "https://api.skayle.ai/v1/ORG_ID/articles/b2b-saas-content-strategy-2026?include=categories,tags,authors"
Example request (collection item)
curl "https://api.skayle.ai/v1/ORG_ID/collections/answers/items/what-is-product-led-seo"
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_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",
"seo_title": "B2B SaaS Content Strategy for 2026",
"meta_description": "Framework for planning and publishing ranking-focused content.",
"author": "Alex Jordan",
"created_at": "2026-01-28T12:15:01.000Z",
"updated_at": "2026-02-01T09:20:11.000Z"
},
"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": "author_01HZX...",
"type": "authors",
"attributes": {
"name": "Alex Jordan",
"slug": "alex-jordan",
"bio": "SEO lead focused on B2B SaaS growth.",
"avatar_url": "https://cdn.example.com/avatar.jpg",
"social_links": {
"linkedin": "https://www.linkedin.com/in/alex-jordan"
}
}
}
]
}
Error responses
Content not found
{
"errors": [
{
"status": "404",
"title": "Not Found",
"detail": "Post with id or slug \"missing-post\" not found"
}
]
}
Response field descriptions
| Field | Type | Description |
|---|---|---|
data.id | string | Content ID |
data.type | string | Resource type (articles for root feed, items for non-article collections) |
data.attributes.title | string | Content title |
data.attributes.slug | string | Content slug |
data.attributes.excerpt | string | null | Summary text |
data.attributes.content | string | Content body |
data.attributes.content_html | string | null | Rendered HTML |
data.attributes.comparison_screenshots | array | Competitor screenshot metadata for comparison sections |
data.attributes.status | string | Content status (published, draft, scheduled) |
data.attributes.author | string | null | Display author name |
data.attributes.created_at | string | ISO datetime |
data.attributes.updated_at | string | ISO datetime |
data.relationships | object | Linked taxonomy references |
included[] | array | Optional included resources |
Notes
- Path supports either a content ID or slug.
/posts/:id-or-slugremains backward-compatible.- For comparison posts,
content_htmlmay include embedded<img>tags directly below competitorH2headings, andcomparison_screenshotsreturns structured capture metadata.
⌘I
Get Article / Item
curl --request GET \
--url https://api.example.com/articles/:id-or-slugimport requests
url = "https://api.example.com/articles/:id-or-slug"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://api.example.com/articles/:id-or-slug', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.example.com/articles/:id-or-slug",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.example.com/articles/:id-or-slug"
req, _ := http.NewRequest("GET", url, nil)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.example.com/articles/:id-or-slug")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/articles/:id-or-slug")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
response = http.request(request)
puts response.read_body