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.
string
required
Bearer token. Example:
Bearer qw-api-xxxPath Parameters
string
required
The unique identifier of the brand
string
required
The unique identifier of the article
Response
boolean
Indicates if the request was successful
object
id, name, domainobject
Show Article
Show Article
string
Article ID
string
Article title
string
URL slug or
nullstring
Short description or
nullstring
Full article body in Markdown
string
Article type
string
DRAFT, GENERATING, LIVE or ARCHIVEDnumber
Target word count used for generation
number
Actual word count
string
Generation guidelines or
nullboolean
Whether a TL;DR was requested
boolean
Whether an FAQ was requested
object
SEO/initialization metadata (JSON) or
nullobject
Structured outline with
sections or nullstring
Published URL (if set by you) or
nullstring
Publish timestamp (ISO 8601) or
nullstring
Content generation timestamp (ISO 8601) or
nullstring
Creation timestamp (ISO 8601)
string
Last update timestamp (ISO 8601)
array
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

