Presets
Create and manage Octopost publishing presets (saved platform selections and cross-link settings) through the REST API.
A preset is a saved set of networks plus cross-link settings, for example "X and Bluesky, post to X first and link to it from Bluesky". The dashboard composer uses your default preset to pre-select networks.
POST /api/posts doesn't take a preset id. To post with a preset, read it and copy its platforms, primaryPlatform, crossLinkEnabled and crossLinkTemplate into the post.
Network status (2026-11): only
bluesky,mastodonandthreads(after Meta approval) can be posted to. Preset endpoints still accept older network ids (tiktok,youtube,telegram,discord,slack), and one built-in preset lists TikTok, Instagram and YouTube, but Octopost can't post to those networks.
Preset endpoints take camelCase fields only. snake_case fields such as cross_link_enabled are ignored.
The preset object#
{
"id": "9e8d7c6b-...",
"name": "X first, then Bluesky",
"platforms": ["twitter", "bluesky"],
"primaryPlatform": "twitter",
"crossLinkEnabled": 1,
"crossLinkTemplate": "New post on {platform}: {link}",
"isDefault": 0,
"isSystem": 0,
"createdAt": "2026-11-04T15:00:00.000Z",
"updatedAt": "2026-11-04T15:00:00.000Z"
}| Field | Type | Description |
|---|---|---|
id | string | Preset id. Built-in presets may have ids like system-0. |
name | string | Up to 100 characters. |
platforms | string[] | Networks in the preset. |
primaryPlatform | string | null | Network to publish first when cross-linking. |
crossLinkEnabled | boolean | When on, Octopost publishes to primaryPlatform first and posts a link to it on the other networks. |
crossLinkTemplate | string | Cross-link text. Variables: {platform}, {link}, {title}, {excerpt}. Default New post on {platform}: {link}. |
isDefault | boolean | Your default preset. Only one at a time. |
isSystem | boolean | Built-in preset. Can't be changed or deleted. |
createdAt, updatedAt | string | ISO 8601 timestamps. Not included on built-in presets in the list. |
Boolean fields read from storage come back as 0 or 1.
List presets#
GET /api/presetsReturns your presets and the built-in ones in two lists:
{
"success": true,
"presets": {
"user": [
{
"id": "9e8d7c6b-...",
"name": "X first, then Bluesky",
"platforms": ["twitter", "bluesky"],
"primaryPlatform": "twitter",
"crossLinkEnabled": 1,
"crossLinkTemplate": "New post on {platform}: {link}",
"isDefault": 1,
"isSystem": 0,
"createdAt": "2026-11-04T15:00:00.000Z",
"updatedAt": "2026-11-04T15:00:00.000Z"
}
],
"system": [
{
"id": "system-0",
"name": "All Platforms",
"platforms": ["twitter", "linkedin", "bluesky", "mastodon", "threads"],
"primaryPlatform": null,
"crossLinkEnabled": false,
"crossLinkTemplate": "New post on {platform}: {link}",
"isDefault": false,
"isSystem": true
}
]
}
}user is sorted default first, then newest. The built-in presets are All Platforms, Professional Networks, Decentralized Social and Text-first. A built-in preset with no network you can connect is left out of system.
Create a preset#
POST /api/presets| Field | Type | Required | Description |
|---|---|---|---|
name | string | Yes | 1 to 100 characters. |
platforms | string[] | Yes | At least one network. |
primaryPlatform | string | null | No | Network to publish first. |
crossLinkEnabled | boolean | No | Default false. |
crossLinkTemplate | string | No | Up to 500 characters. Default New post on {platform}: {link}. |
isDefault | boolean | No | Make it your default (clears the previous default). Default false. |
curl -X POST https://octopost.ink/api/presets \
-H "Authorization: Bearer op_your_api_key_here" \
-H "Content-Type: application/json" \
-d '{
"name": "X first, then Bluesky",
"platforms": ["twitter", "bluesky"],
"primaryPlatform": "twitter",
"crossLinkEnabled": true
}'Returns 201 with { "success": true, "preset": { ... } }. Validation errors return 400 { "error": "Invalid request", "details": [...] }.
Get a preset#
GET /api/presets/{id}Returns { "success": true, "preset": { ... } } for one of your presets. Built-in presets can't be fetched by id (400 for system-* ids, 404 otherwise); read them from the list.
Update a preset#
PUT /api/presets/{id}Send any of the create fields. isDefault: true makes it your default and clears the previous one.
Returns { "success": true, "preset": { ... } }.
| Status | Body |
|---|---|
400 | { "error": "Cannot edit system presets" } |
400 | { "error": "Invalid request", "details": [...] } |
404 | { "error": "Preset not found" } |
Delete a preset#
DELETE /api/presets/{id}{ "success": true, "message": "Preset deleted successfully" }Built-in presets return 400 { "error": "Cannot delete system presets" }. 404 { "error": "Preset not found" } if it isn't yours. Deleting your default leaves you with no default.
Set the default preset#
POST /api/presets/{id}/set-defaultNo body. Makes this preset your default and clears the previous default. Returns { "success": true, "preset": { ... } }. Built-in presets return 400 { "error": "Cannot set system presets as default" }.