curl --request PATCH \
--url https://app.tryordinal.com/api/v1/ideas/{id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"title": "Updated Idea Title",
"linkedIn": {
"copy": "Updated LinkedIn content"
}
}
'import requests
url = "https://app.tryordinal.com/api/v1/ideas/{id}"
payload = {
"title": "Updated Idea Title",
"linkedIn": { "copy": "Updated LinkedIn content" }
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({title: 'Updated Idea Title', linkedIn: {copy: 'Updated LinkedIn content'}})
};
fetch('https://app.tryordinal.com/api/v1/ideas/{id}', 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/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'title' => 'Updated Idea Title',
'linkedIn' => [
'copy' => 'Updated LinkedIn content'
]
]),
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/{id}"
payload := strings.NewReader("{\n \"title\": \"Updated Idea Title\",\n \"linkedIn\": {\n \"copy\": \"Updated LinkedIn content\"\n }\n}")
req, _ := http.NewRequest("PATCH", 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.patch("https://app.tryordinal.com/api/v1/ideas/{id}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"title\": \"Updated Idea Title\",\n \"linkedIn\": {\n \"copy\": \"Updated LinkedIn content\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.tryordinal.com/api/v1/ideas/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"title\": \"Updated Idea Title\",\n \"linkedIn\": {\n \"copy\": \"Updated LinkedIn content\"\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": "Updated Idea Title",
"channels": [
"LinkedIn"
],
"status": "Idea",
"updatedAt": "2026-02-18T15:00:00.000Z",
"linkedIn": {
"copy": "Updated LinkedIn content",
"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"
}{
"code": "NOT_FOUND",
"message": "Post not found or does not belong to this workspace"
}Update idea
Update an existing idea by ID. All fields are optional - only include the fields you want to update. Archived ideas cannot be updated; unarchive them first.
curl --request PATCH \
--url https://app.tryordinal.com/api/v1/ideas/{id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"title": "Updated Idea Title",
"linkedIn": {
"copy": "Updated LinkedIn content"
}
}
'import requests
url = "https://app.tryordinal.com/api/v1/ideas/{id}"
payload = {
"title": "Updated Idea Title",
"linkedIn": { "copy": "Updated LinkedIn content" }
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({title: 'Updated Idea Title', linkedIn: {copy: 'Updated LinkedIn content'}})
};
fetch('https://app.tryordinal.com/api/v1/ideas/{id}', 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/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'title' => 'Updated Idea Title',
'linkedIn' => [
'copy' => 'Updated LinkedIn content'
]
]),
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/{id}"
payload := strings.NewReader("{\n \"title\": \"Updated Idea Title\",\n \"linkedIn\": {\n \"copy\": \"Updated LinkedIn content\"\n }\n}")
req, _ := http.NewRequest("PATCH", 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.patch("https://app.tryordinal.com/api/v1/ideas/{id}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"title\": \"Updated Idea Title\",\n \"linkedIn\": {\n \"copy\": \"Updated LinkedIn content\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.tryordinal.com/api/v1/ideas/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"title\": \"Updated Idea Title\",\n \"linkedIn\": {\n \"copy\": \"Updated LinkedIn content\"\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": "Updated Idea Title",
"channels": [
"LinkedIn"
],
"status": "Idea",
"updatedAt": "2026-02-18T15:00:00.000Z",
"linkedIn": {
"copy": "Updated LinkedIn content",
"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"
}{
"code": "NOT_FOUND",
"message": "Post not found or does not belong to this workspace"
}Authorizations
API key authentication. Generate an API key from your workspace settings.
Path Parameters
Idea ID (UUID)
Body
Idea title
1Label IDs to attach to the idea (replaces existing labels)
Campaign ID to link the idea to (null to unlink)
LinkedIn channel content updates
Show child attributes
Show child attributes
X/Twitter channel content updates
Show child attributes
Show child attributes
TikTok channel content updates. All fields are optional.
Show child attributes
Show child attributes
YouTube Shorts channel content updates. All fields are optional.
Show child attributes
Show child attributes
Internal notes for the idea
Response
Idea updated successfully
Response when updating 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?