curl --request POST \
--url https://api.parallellabs.app/api/v0/content \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"companyId": "<string>",
"title": "<string>",
"type": "<string>",
"status": "<string>",
"category": "<string>",
"topicSummary": "<string>",
"hookOptions": [
"<string>"
],
"selectedHook": "<string>",
"funnelStage": "<string>",
"metaDescription": "<string>",
"focusKeyword": "<string>",
"seoTitle": "<string>",
"slug": "<string>",
"variants": {},
"body": "<string>",
"publishDate": "<string>",
"publishedDate": "<string>",
"publishedUrl": "<string>",
"externalId": "<string>",
"platformType": "<string>",
"campaignId": "<string>"
}
'import requests
url = "https://api.parallellabs.app/api/v0/content"
payload = {
"companyId": "<string>",
"title": "<string>",
"type": "<string>",
"status": "<string>",
"category": "<string>",
"topicSummary": "<string>",
"hookOptions": ["<string>"],
"selectedHook": "<string>",
"funnelStage": "<string>",
"metaDescription": "<string>",
"focusKeyword": "<string>",
"seoTitle": "<string>",
"slug": "<string>",
"variants": {},
"body": "<string>",
"publishDate": "<string>",
"publishedDate": "<string>",
"publishedUrl": "<string>",
"externalId": "<string>",
"platformType": "<string>",
"campaignId": "<string>"
}
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
companyId: '<string>',
title: '<string>',
type: '<string>',
status: '<string>',
category: '<string>',
topicSummary: '<string>',
hookOptions: ['<string>'],
selectedHook: '<string>',
funnelStage: '<string>',
metaDescription: '<string>',
focusKeyword: '<string>',
seoTitle: '<string>',
slug: '<string>',
variants: {},
body: JSON.stringify('<string>'),
publishDate: '<string>',
publishedDate: '<string>',
publishedUrl: '<string>',
externalId: '<string>',
platformType: '<string>',
campaignId: '<string>'
})
};
fetch('https://api.parallellabs.app/api/v0/content', 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.parallellabs.app/api/v0/content",
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([
'companyId' => '<string>',
'title' => '<string>',
'type' => '<string>',
'status' => '<string>',
'category' => '<string>',
'topicSummary' => '<string>',
'hookOptions' => [
'<string>'
],
'selectedHook' => '<string>',
'funnelStage' => '<string>',
'metaDescription' => '<string>',
'focusKeyword' => '<string>',
'seoTitle' => '<string>',
'slug' => '<string>',
'variants' => [
],
'body' => '<string>',
'publishDate' => '<string>',
'publishedDate' => '<string>',
'publishedUrl' => '<string>',
'externalId' => '<string>',
'platformType' => '<string>',
'campaignId' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-Key: <api-key>"
],
]);
$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.parallellabs.app/api/v0/content"
payload := strings.NewReader("{\n \"companyId\": \"<string>\",\n \"title\": \"<string>\",\n \"type\": \"<string>\",\n \"status\": \"<string>\",\n \"category\": \"<string>\",\n \"topicSummary\": \"<string>\",\n \"hookOptions\": [\n \"<string>\"\n ],\n \"selectedHook\": \"<string>\",\n \"funnelStage\": \"<string>\",\n \"metaDescription\": \"<string>\",\n \"focusKeyword\": \"<string>\",\n \"seoTitle\": \"<string>\",\n \"slug\": \"<string>\",\n \"variants\": {},\n \"body\": \"<string>\",\n \"publishDate\": \"<string>\",\n \"publishedDate\": \"<string>\",\n \"publishedUrl\": \"<string>\",\n \"externalId\": \"<string>\",\n \"platformType\": \"<string>\",\n \"campaignId\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-API-Key", "<api-key>")
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.parallellabs.app/api/v0/content")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"companyId\": \"<string>\",\n \"title\": \"<string>\",\n \"type\": \"<string>\",\n \"status\": \"<string>\",\n \"category\": \"<string>\",\n \"topicSummary\": \"<string>\",\n \"hookOptions\": [\n \"<string>\"\n ],\n \"selectedHook\": \"<string>\",\n \"funnelStage\": \"<string>\",\n \"metaDescription\": \"<string>\",\n \"focusKeyword\": \"<string>\",\n \"seoTitle\": \"<string>\",\n \"slug\": \"<string>\",\n \"variants\": {},\n \"body\": \"<string>\",\n \"publishDate\": \"<string>\",\n \"publishedDate\": \"<string>\",\n \"publishedUrl\": \"<string>\",\n \"externalId\": \"<string>\",\n \"platformType\": \"<string>\",\n \"campaignId\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.parallellabs.app/api/v0/content")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"companyId\": \"<string>\",\n \"title\": \"<string>\",\n \"type\": \"<string>\",\n \"status\": \"<string>\",\n \"category\": \"<string>\",\n \"topicSummary\": \"<string>\",\n \"hookOptions\": [\n \"<string>\"\n ],\n \"selectedHook\": \"<string>\",\n \"funnelStage\": \"<string>\",\n \"metaDescription\": \"<string>\",\n \"focusKeyword\": \"<string>\",\n \"seoTitle\": \"<string>\",\n \"slug\": \"<string>\",\n \"variants\": {},\n \"body\": \"<string>\",\n \"publishDate\": \"<string>\",\n \"publishedDate\": \"<string>\",\n \"publishedUrl\": \"<string>\",\n \"externalId\": \"<string>\",\n \"platformType\": \"<string>\",\n \"campaignId\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"id": "<string>",
"content": {}
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}Manually create a new content engine record.
Use this to insert a content piece directly (skipping AI ideation/generation),
e.g. to import an existing post or log content authored elsewhere. The body
is set via either variants.default or the body convenience field. For
blog_post, both fields must contain Markdown source, never rendered HTML;
publishing converts the Markdown to HTML for the destination.
Example: {"type":"blog_post","title":"A practical guide","body":"# Start here\n\nWrite the article in Markdown."}
curl --request POST \
--url https://api.parallellabs.app/api/v0/content \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"companyId": "<string>",
"title": "<string>",
"type": "<string>",
"status": "<string>",
"category": "<string>",
"topicSummary": "<string>",
"hookOptions": [
"<string>"
],
"selectedHook": "<string>",
"funnelStage": "<string>",
"metaDescription": "<string>",
"focusKeyword": "<string>",
"seoTitle": "<string>",
"slug": "<string>",
"variants": {},
"body": "<string>",
"publishDate": "<string>",
"publishedDate": "<string>",
"publishedUrl": "<string>",
"externalId": "<string>",
"platformType": "<string>",
"campaignId": "<string>"
}
'import requests
url = "https://api.parallellabs.app/api/v0/content"
payload = {
"companyId": "<string>",
"title": "<string>",
"type": "<string>",
"status": "<string>",
"category": "<string>",
"topicSummary": "<string>",
"hookOptions": ["<string>"],
"selectedHook": "<string>",
"funnelStage": "<string>",
"metaDescription": "<string>",
"focusKeyword": "<string>",
"seoTitle": "<string>",
"slug": "<string>",
"variants": {},
"body": "<string>",
"publishDate": "<string>",
"publishedDate": "<string>",
"publishedUrl": "<string>",
"externalId": "<string>",
"platformType": "<string>",
"campaignId": "<string>"
}
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
companyId: '<string>',
title: '<string>',
type: '<string>',
status: '<string>',
category: '<string>',
topicSummary: '<string>',
hookOptions: ['<string>'],
selectedHook: '<string>',
funnelStage: '<string>',
metaDescription: '<string>',
focusKeyword: '<string>',
seoTitle: '<string>',
slug: '<string>',
variants: {},
body: JSON.stringify('<string>'),
publishDate: '<string>',
publishedDate: '<string>',
publishedUrl: '<string>',
externalId: '<string>',
platformType: '<string>',
campaignId: '<string>'
})
};
fetch('https://api.parallellabs.app/api/v0/content', 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.parallellabs.app/api/v0/content",
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([
'companyId' => '<string>',
'title' => '<string>',
'type' => '<string>',
'status' => '<string>',
'category' => '<string>',
'topicSummary' => '<string>',
'hookOptions' => [
'<string>'
],
'selectedHook' => '<string>',
'funnelStage' => '<string>',
'metaDescription' => '<string>',
'focusKeyword' => '<string>',
'seoTitle' => '<string>',
'slug' => '<string>',
'variants' => [
],
'body' => '<string>',
'publishDate' => '<string>',
'publishedDate' => '<string>',
'publishedUrl' => '<string>',
'externalId' => '<string>',
'platformType' => '<string>',
'campaignId' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-Key: <api-key>"
],
]);
$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.parallellabs.app/api/v0/content"
payload := strings.NewReader("{\n \"companyId\": \"<string>\",\n \"title\": \"<string>\",\n \"type\": \"<string>\",\n \"status\": \"<string>\",\n \"category\": \"<string>\",\n \"topicSummary\": \"<string>\",\n \"hookOptions\": [\n \"<string>\"\n ],\n \"selectedHook\": \"<string>\",\n \"funnelStage\": \"<string>\",\n \"metaDescription\": \"<string>\",\n \"focusKeyword\": \"<string>\",\n \"seoTitle\": \"<string>\",\n \"slug\": \"<string>\",\n \"variants\": {},\n \"body\": \"<string>\",\n \"publishDate\": \"<string>\",\n \"publishedDate\": \"<string>\",\n \"publishedUrl\": \"<string>\",\n \"externalId\": \"<string>\",\n \"platformType\": \"<string>\",\n \"campaignId\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-API-Key", "<api-key>")
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.parallellabs.app/api/v0/content")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"companyId\": \"<string>\",\n \"title\": \"<string>\",\n \"type\": \"<string>\",\n \"status\": \"<string>\",\n \"category\": \"<string>\",\n \"topicSummary\": \"<string>\",\n \"hookOptions\": [\n \"<string>\"\n ],\n \"selectedHook\": \"<string>\",\n \"funnelStage\": \"<string>\",\n \"metaDescription\": \"<string>\",\n \"focusKeyword\": \"<string>\",\n \"seoTitle\": \"<string>\",\n \"slug\": \"<string>\",\n \"variants\": {},\n \"body\": \"<string>\",\n \"publishDate\": \"<string>\",\n \"publishedDate\": \"<string>\",\n \"publishedUrl\": \"<string>\",\n \"externalId\": \"<string>\",\n \"platformType\": \"<string>\",\n \"campaignId\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.parallellabs.app/api/v0/content")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"companyId\": \"<string>\",\n \"title\": \"<string>\",\n \"type\": \"<string>\",\n \"status\": \"<string>\",\n \"category\": \"<string>\",\n \"topicSummary\": \"<string>\",\n \"hookOptions\": [\n \"<string>\"\n ],\n \"selectedHook\": \"<string>\",\n \"funnelStage\": \"<string>\",\n \"metaDescription\": \"<string>\",\n \"focusKeyword\": \"<string>\",\n \"seoTitle\": \"<string>\",\n \"slug\": \"<string>\",\n \"variants\": {},\n \"body\": \"<string>\",\n \"publishDate\": \"<string>\",\n \"publishedDate\": \"<string>\",\n \"publishedUrl\": \"<string>\",\n \"externalId\": \"<string>\",\n \"platformType\": \"<string>\",\n \"campaignId\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"id": "<string>",
"content": {}
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}Authorizations
Company API key - scoped to a specific company. Generate from the Integrations page in your dashboard.
Body
Content fields for the new record
Request body for manually creating a content engine record
Company ID
Content title
Content type. One of: blog_post, facebook_post, linkedin_post, instagram_post, x_post, youtube_video, tiktok_video, email_newsletter, podcast_episode, website_copy, marketing_email, ad_copy, press_release
Content status (default: draft). One of: ideated, queued, generating, draft, scheduled, published, archived
Content category
Topic summary
List of hook options
Selected hook
Funnel stage: N/A, tofu, mofu, bofu
Meta description (used for SEO and social previews)
Search phrase the post targets (blog posts only; blank for idea-only posts)
SERP , distinct from the article title (<=60 chars; blog posts only)
Short URL slug for the published post (blog posts only)
Content variants. For type=blog_post, set default to the article body as Markdown source (for example, "# Heading\n\nParagraph text"). Do not send rendered HTML such as
or
tags. The publisher converts Markdown to destination HTML.
Convenience field for the main body. For type=blog_post, send Markdown source only; do not send HTML. Stored at variants.default and ignored if variants is provided.
Planned publish date (ISO 8601 datetime)
Actual publish date when status is published (ISO 8601)
Public URL of the published content
External platform identifier
Platform the content was published to (e.g., wordpress, linkedin)
Campaign ID to associate this content with

