curl --request POST \
--url https://api.example.com/v1/workspaces/{workspaceId}/contents \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"title": "<string>",
"assignedToId": "<string>",
"contentStatusId": "<string>",
"dueDate": "<string>",
"folderId": "<string>",
"html": "<string>",
"metaDescription": "<string>",
"pageId": "<string>"
}
'import requests
url = "https://api.example.com/v1/workspaces/{workspaceId}/contents"
payload = {
"title": "<string>",
"assignedToId": "<string>",
"contentStatusId": "<string>",
"dueDate": "<string>",
"folderId": "<string>",
"html": "<string>",
"metaDescription": "<string>",
"pageId": "<string>"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
title: '<string>',
assignedToId: '<string>',
contentStatusId: '<string>',
dueDate: '<string>',
folderId: '<string>',
html: '<string>',
metaDescription: '<string>',
pageId: '<string>'
})
};
fetch('https://api.example.com/v1/workspaces/{workspaceId}/contents', 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/v1/workspaces/{workspaceId}/contents",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'title' => '<string>',
'assignedToId' => '<string>',
'contentStatusId' => '<string>',
'dueDate' => '<string>',
'folderId' => '<string>',
'html' => '<string>',
'metaDescription' => '<string>',
'pageId' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.example.com/v1/workspaces/{workspaceId}/contents"
payload := strings.NewReader("{\n \"title\": \"<string>\",\n \"assignedToId\": \"<string>\",\n \"contentStatusId\": \"<string>\",\n \"dueDate\": \"<string>\",\n \"folderId\": \"<string>\",\n \"html\": \"<string>\",\n \"metaDescription\": \"<string>\",\n \"pageId\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.example.com/v1/workspaces/{workspaceId}/contents")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"title\": \"<string>\",\n \"assignedToId\": \"<string>\",\n \"contentStatusId\": \"<string>\",\n \"dueDate\": \"<string>\",\n \"folderId\": \"<string>\",\n \"html\": \"<string>\",\n \"metaDescription\": \"<string>\",\n \"pageId\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/v1/workspaces/{workspaceId}/contents")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"title\": \"<string>\",\n \"assignedToId\": \"<string>\",\n \"contentStatusId\": \"<string>\",\n \"dueDate\": \"<string>\",\n \"folderId\": \"<string>\",\n \"html\": \"<string>\",\n \"metaDescription\": \"<string>\",\n \"pageId\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"assignedTo": {
"email": "<string>",
"firstName": "<string>",
"id": "<string>",
"lastName": "<string>",
"profileImageUrl": "<string>"
},
"contentScore": 123,
"contentStatus": {
"color": "<string>",
"id": "<string>",
"isReadOnly": true,
"label": "<string>",
"position": 123
},
"contentUpdatedAt": "<string>",
"createdAt": "<string>",
"dueDate": "<string>",
"folder": {
"id": "<string>",
"name": "<string>"
},
"id": "<string>",
"page": {
"id": "<string>",
"lastStatusCode": 123,
"url": "<string>"
},
"publishedAt": "<string>",
"title": "<string>",
"type": "DRAFT",
"updatedAt": "<string>",
"wordsCount": 123,
"contentUpdatedBy": {
"firstName": "<string>",
"id": "<string>",
"lastName": "<string>"
},
"html": "<string>",
"htmlSanitized": "<string>",
"isStarted": true,
"lastGeneration": {
"id": "<string>",
"status": "queued",
"type": "optimize"
},
"metaDescription": "<string>",
"publishedBy": {
"firstName": "<string>",
"id": "<string>",
"lastName": "<string>"
},
"version": 123
}Create a content
Creates a new content draft in the workspace. Pass pageId to attach the draft to an existing imported page, or omit it to create a blank draft (editorial brief with no URL) — in that case an empty page is auto-created and returned in the response.
curl --request POST \
--url https://api.example.com/v1/workspaces/{workspaceId}/contents \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"title": "<string>",
"assignedToId": "<string>",
"contentStatusId": "<string>",
"dueDate": "<string>",
"folderId": "<string>",
"html": "<string>",
"metaDescription": "<string>",
"pageId": "<string>"
}
'import requests
url = "https://api.example.com/v1/workspaces/{workspaceId}/contents"
payload = {
"title": "<string>",
"assignedToId": "<string>",
"contentStatusId": "<string>",
"dueDate": "<string>",
"folderId": "<string>",
"html": "<string>",
"metaDescription": "<string>",
"pageId": "<string>"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
title: '<string>',
assignedToId: '<string>',
contentStatusId: '<string>',
dueDate: '<string>',
folderId: '<string>',
html: '<string>',
metaDescription: '<string>',
pageId: '<string>'
})
};
fetch('https://api.example.com/v1/workspaces/{workspaceId}/contents', 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/v1/workspaces/{workspaceId}/contents",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'title' => '<string>',
'assignedToId' => '<string>',
'contentStatusId' => '<string>',
'dueDate' => '<string>',
'folderId' => '<string>',
'html' => '<string>',
'metaDescription' => '<string>',
'pageId' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.example.com/v1/workspaces/{workspaceId}/contents"
payload := strings.NewReader("{\n \"title\": \"<string>\",\n \"assignedToId\": \"<string>\",\n \"contentStatusId\": \"<string>\",\n \"dueDate\": \"<string>\",\n \"folderId\": \"<string>\",\n \"html\": \"<string>\",\n \"metaDescription\": \"<string>\",\n \"pageId\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.example.com/v1/workspaces/{workspaceId}/contents")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"title\": \"<string>\",\n \"assignedToId\": \"<string>\",\n \"contentStatusId\": \"<string>\",\n \"dueDate\": \"<string>\",\n \"folderId\": \"<string>\",\n \"html\": \"<string>\",\n \"metaDescription\": \"<string>\",\n \"pageId\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/v1/workspaces/{workspaceId}/contents")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"title\": \"<string>\",\n \"assignedToId\": \"<string>\",\n \"contentStatusId\": \"<string>\",\n \"dueDate\": \"<string>\",\n \"folderId\": \"<string>\",\n \"html\": \"<string>\",\n \"metaDescription\": \"<string>\",\n \"pageId\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"assignedTo": {
"email": "<string>",
"firstName": "<string>",
"id": "<string>",
"lastName": "<string>",
"profileImageUrl": "<string>"
},
"contentScore": 123,
"contentStatus": {
"color": "<string>",
"id": "<string>",
"isReadOnly": true,
"label": "<string>",
"position": 123
},
"contentUpdatedAt": "<string>",
"createdAt": "<string>",
"dueDate": "<string>",
"folder": {
"id": "<string>",
"name": "<string>"
},
"id": "<string>",
"page": {
"id": "<string>",
"lastStatusCode": 123,
"url": "<string>"
},
"publishedAt": "<string>",
"title": "<string>",
"type": "DRAFT",
"updatedAt": "<string>",
"wordsCount": 123,
"contentUpdatedBy": {
"firstName": "<string>",
"id": "<string>",
"lastName": "<string>"
},
"html": "<string>",
"htmlSanitized": "<string>",
"isStarted": true,
"lastGeneration": {
"id": "<string>",
"status": "queued",
"type": "optimize"
},
"metaDescription": "<string>",
"publishedBy": {
"firstName": "<string>",
"id": "<string>",
"lastName": "<string>"
},
"version": 123
}Authorizations
API key starting with sk_. Generate one in Settings > API Keys.
Path Parameters
Workspace ID.
Body
Title of the new content.
1 - 255Optional user ID to assign.
Optional workflow status ID.
Optional due date (ISO 8601).
Optional folder ID.
Initial HTML body.
Initial meta description.
ID of an existing page to attach this content to. If omitted, a new page is created.
Response
Default Response
User assigned to this content.
Show child attributes
Show child attributes
This score out of 100 measures the SEO quality of a content.
Workflow status assigned to this content.
Show child attributes
Show child attributes
ISO 8601 date of the last content body change.
ISO 8601 creation date.
Due date (ISO 8601).
Folder this content is organized in.
Show child attributes
Show child attributes
Unique identifier of the content.
Page this content belongs to.
Show child attributes
Show child attributes
Publication date (ISO 8601).
Title of the content.
Content type.
DRAFT, PUBLISHED, ORIGINAL ISO 8601 last update date.
Number of words in the content.
User who last edited the content body.
Show child attributes
Show child attributes
HTML body of the content as authored in the Semji editor. May contain editor-only markers (comments, fact-check annotations) — for a clean version safe to publish externally, use htmlSanitized.
HTML body of the content with all Semji editor annotations (comments, fact-check markers) stripped. Safe to push into a CMS or publish externally.
Whether the content has any HTML body.
Last Atomic Content generation.
Show child attributes
Show child attributes
Meta description for SEO.
User who published this content.
Show child attributes
Show child attributes
Optimistic locking version.
Was this page helpful?