Get Content
curl --request GET \
--url https://api.example.com/api/v1/brands/{brandId}/content/{articleId} \
--header 'Authorization: <authorization>'import requests
url = "https://api.example.com/api/v1/brands/{brandId}/content/{articleId}"
headers = {"Authorization": "<authorization>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: '<authorization>'}};
fetch('https://api.example.com/api/v1/brands/{brandId}/content/{articleId}', 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/api/v1/brands/{brandId}/content/{articleId}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: <authorization>"
],
]);
$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/api/v1/brands/{brandId}/content/{articleId}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "<authorization>")
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/api/v1/brands/{brandId}/content/{articleId}")
.header("Authorization", "<authorization>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/api/v1/brands/{brandId}/content/{articleId}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = '<authorization>'
response = http.request(request)
puts response.read_body{
"success": true,
"brand": {},
"article": {
"id": "<string>",
"title": "<string>",
"slug": "<string>",
"description": "<string>",
"content": "<string>",
"articleType": "<string>",
"status": "<string>",
"targetLength": 123,
"wordCount": 123,
"guidelines": "<string>",
"includeTldr": true,
"includeFaq": true,
"metaData": {},
"outline": {},
"finalUrl": "<string>",
"publishedAt": "<string>",
"generatedAt": "<string>",
"createdAt": "<string>",
"updatedAt": "<string>",
"sources": [
{}
]
}
}Content Studio
Get Content
Retrieve a full Content Studio article including the markdown body
GET
/
api
/
v1
/
brands
/
{brandId}
/
content
/
{articleId}
Get Content
curl --request GET \
--url https://api.example.com/api/v1/brands/{brandId}/content/{articleId} \
--header 'Authorization: <authorization>'import requests
url = "https://api.example.com/api/v1/brands/{brandId}/content/{articleId}"
headers = {"Authorization": "<authorization>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: '<authorization>'}};
fetch('https://api.example.com/api/v1/brands/{brandId}/content/{articleId}', 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/api/v1/brands/{brandId}/content/{articleId}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: <authorization>"
],
]);
$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/api/v1/brands/{brandId}/content/{articleId}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "<authorization>")
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/api/v1/brands/{brandId}/content/{articleId}")
.header("Authorization", "<authorization>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/api/v1/brands/{brandId}/content/{articleId}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = '<authorization>'
response = http.request(request)
puts response.read_body{
"success": true,
"brand": {},
"article": {
"id": "<string>",
"title": "<string>",
"slug": "<string>",
"description": "<string>",
"content": "<string>",
"articleType": "<string>",
"status": "<string>",
"targetLength": 123,
"wordCount": 123,
"guidelines": "<string>",
"includeTldr": true,
"includeFaq": true,
"metaData": {},
"outline": {},
"finalUrl": "<string>",
"publishedAt": "<string>",
"generatedAt": "<string>",
"createdAt": "<string>",
"updatedAt": "<string>",
"sources": [
{}
]
}
}Retrieve a single Content Studio article with its full markdown
A
content, outline, metadata and sources. This is the endpoint to call from a CMS automation once you have an article ID from List Content.
Bearer token. Example:
Bearer qw-api-xxxPath Parameters
The unique identifier of the brand
The unique identifier of the article
Response
Indicates if the request was successful
id, name, domainShow Article
Show Article
Article ID
Article title
URL slug or
nullShort description or
nullFull article body in Markdown
Article type
DRAFT, GENERATING, LIVE or ARCHIVEDTarget word count used for generation
Actual word count
Generation guidelines or
nullWhether a TL;DR was requested
Whether an FAQ was requested
SEO/initialization metadata (JSON) or
nullStructured outline with
sections or nullPublished URL (if set by you) or
nullPublish timestamp (ISO 8601) or
nullContent generation timestamp (ISO 8601) or
nullCreation timestamp (ISO 8601)
Last update timestamp (ISO 8601)
Sources used for the article. Each object has
id, title, url, usageType, order.404 RESOURCE_NOT_FOUND is returned if the article does not exist or does not belong to the brand.
Example Request
curl -X GET "https://www.qwairy.co/api/v1/brands/cm1234567890abcdef/content/art_abc123" \
-H "Authorization: Bearer qw-api-your-token-here"
Example Response
{
"success": true,
"brand": {
"id": "cm1234567890abcdef",
"name": "My Brand",
"domain": "mybrand.com"
},
"article": {
"id": "art_abc123",
"title": "How to choose the right solution in 2026",
"slug": "how-to-choose-the-right-solution-2026",
"description": "A practical buyer's guide.",
"content": "# How to choose the right solution in 2026\n\n## Introduction\n\n...",
"articleType": "HOW_TO",
"status": "LIVE",
"targetLength": 1500,
"wordCount": 1480,
"guidelines": null,
"includeTldr": true,
"includeFaq": false,
"metaData": {
"seo": {
"metaTitle": "How to choose the right solution (2026 guide)",
"metaDescription": "A practical buyer's guide for 2026."
}
},
"outline": {
"sections": [
{ "id": "s1", "level": 2, "title": "Introduction", "order": 0 }
],
"generatedAt": "2026-05-08T14:20:00.000Z"
},
"finalUrl": "https://mybrand.com/blog/how-to-choose",
"publishedAt": "2026-05-10T09:00:00.000Z",
"generatedAt": "2026-05-08T14:22:00.000Z",
"createdAt": "2026-05-08T13:50:00.000Z",
"updatedAt": "2026-05-10T09:00:00.000Z",
"sources": [
{
"id": "src_1",
"title": "Industry benchmark report",
"url": "https://example.com/benchmark",
"usageType": "AUTO",
"order": 0
}
]
}
}
⌘I

