curl --request POST \
--url https://app.tryordinal.com/api/v1/ideas \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"title": "My Idea",
"linkedIn": {
"copy": "This is my idea content for LinkedIn"
}
}
'import requests
url = "https://app.tryordinal.com/api/v1/ideas"
payload = {
"title": "My Idea",
"linkedIn": { "copy": "This is my idea content for LinkedIn" }
}
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: 'My Idea', linkedIn: {copy: 'This is my idea content for LinkedIn'}})
};
fetch('https://app.tryordinal.com/api/v1/ideas', 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://app.tryordinal.com/api/v1/ideas",
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' => 'My Idea',
'linkedIn' => [
'copy' => 'This is my idea content for LinkedIn'
]
]),
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://app.tryordinal.com/api/v1/ideas"
payload := strings.NewReader("{\n \"title\": \"My Idea\",\n \"linkedIn\": {\n \"copy\": \"This is my idea content for LinkedIn\"\n }\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://app.tryordinal.com/api/v1/ideas")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"title\": \"My Idea\",\n \"linkedIn\": {\n \"copy\": \"This is my idea content for LinkedIn\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.tryordinal.com/api/v1/ideas")
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\": \"My Idea\",\n \"linkedIn\": {\n \"copy\": \"This is my idea content for LinkedIn\"\n }\n}"
response = http.request(request)
puts response.read_body{
"id": "550e8400-e29b-41d4-a716-446655440000",
"url": "https://app.tryordinal.com/workspace/ideas/550e8400-e29b-41d4-a716-446655440000",
"title": "My Idea",
"channels": [
"LinkedIn"
],
"status": "Idea",
"createdAt": "2026-02-18T14:30:00.000Z",
"updatedAt": "2026-02-18T14:30:00.000Z",
"linkedIn": {
"copy": "This is my idea content for LinkedIn",
"assets": []
},
"x": null
}{
"code": "BAD_REQUEST",
"message": "Bad Request",
"data": {
"errors": {
"publishAt": [
"Invalid date format"
],
"status": [
"Invalid enum value"
]
}
}
}{
"code": "UNAUTHORIZED",
"message": "Invalid or unauthorized API key"
}Create idea
Create a new idea in the workspace. At least one channel (linkedIn, x, or tikTok) is required.
curl --request POST \
--url https://app.tryordinal.com/api/v1/ideas \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"title": "My Idea",
"linkedIn": {
"copy": "This is my idea content for LinkedIn"
}
}
'import requests
url = "https://app.tryordinal.com/api/v1/ideas"
payload = {
"title": "My Idea",
"linkedIn": { "copy": "This is my idea content for LinkedIn" }
}
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: 'My Idea', linkedIn: {copy: 'This is my idea content for LinkedIn'}})
};
fetch('https://app.tryordinal.com/api/v1/ideas', 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://app.tryordinal.com/api/v1/ideas",
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' => 'My Idea',
'linkedIn' => [
'copy' => 'This is my idea content for LinkedIn'
]
]),
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://app.tryordinal.com/api/v1/ideas"
payload := strings.NewReader("{\n \"title\": \"My Idea\",\n \"linkedIn\": {\n \"copy\": \"This is my idea content for LinkedIn\"\n }\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://app.tryordinal.com/api/v1/ideas")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"title\": \"My Idea\",\n \"linkedIn\": {\n \"copy\": \"This is my idea content for LinkedIn\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.tryordinal.com/api/v1/ideas")
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\": \"My Idea\",\n \"linkedIn\": {\n \"copy\": \"This is my idea content for LinkedIn\"\n }\n}"
response = http.request(request)
puts response.read_body{
"id": "550e8400-e29b-41d4-a716-446655440000",
"url": "https://app.tryordinal.com/workspace/ideas/550e8400-e29b-41d4-a716-446655440000",
"title": "My Idea",
"channels": [
"LinkedIn"
],
"status": "Idea",
"createdAt": "2026-02-18T14:30:00.000Z",
"updatedAt": "2026-02-18T14:30:00.000Z",
"linkedIn": {
"copy": "This is my idea content for LinkedIn",
"assets": []
},
"x": null
}{
"code": "BAD_REQUEST",
"message": "Bad Request",
"data": {
"errors": {
"publishAt": [
"Invalid date format"
],
"status": [
"Invalid enum value"
]
}
}
}{
"code": "UNAUTHORIZED",
"message": "Invalid or unauthorized API key"
}Authorizations
API key authentication. Generate an API key from your workspace settings.
Body
Idea title
Label IDs to attach to the idea
Campaign ID to link the idea to
LinkedIn channel configuration
Show child attributes
Show child attributes
X (Twitter) channel configuration
Show child attributes
Show child attributes
TikTok channel configuration for creating or updating posts. TikTok posts require exactly one video asset.
Show child attributes
Show child attributes
YouTube Shorts channel configuration for creating or updating posts. YouTube Shorts posts require exactly one video asset (1sā3min).
Show child attributes
Show child attributes
Internal notes for the idea
Response
Idea created successfully
Response when creating an idea
Show child attributes
Show child attributes
Show child attributes
Show child attributes
TikTok content. Present when the post targets the TikTok channel.
Show child attributes
Show child attributes
YouTube Shorts content. Present when the post targets the YouTube Shorts channel.
Show child attributes
Show child attributes
Was this page helpful?