Docs
Docs/API Reference/Presets

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 twitter, bluesky, mastodon and linkedin (live) and threads (after Meta approval) can be posted to. Preset endpoints still accept older network ids (facebook, instagram, tiktok, youtube, pinterest, reddit, 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"
}
FieldTypeDescription
idstringPreset id. Built-in presets may have ids like system-0.
namestringUp to 100 characters.
platformsstring[]Networks in the preset.
primaryPlatformstring | nullNetwork to publish first when cross-linking.
crossLinkEnabledbooleanWhen on, Octopost publishes to primaryPlatform first and posts a link to it on the other networks.
crossLinkTemplatestringCross-link text. Variables: {platform}, {link}, {title}, {excerpt}. Default New post on {platform}: {link}.
isDefaultbooleanYour default preset. Only one at a time.
isSystembooleanBuilt-in preset. Can't be changed or deleted.
createdAt, updatedAtstringISO 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/presets

Returns 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
FieldTypeRequiredDescription
namestringYes1 to 100 characters.
platformsstring[]YesAt least one network.
primaryPlatformstring | nullNoNetwork to publish first.
crossLinkEnabledbooleanNoDefault false.
crossLinkTemplatestringNoUp to 500 characters. Default New post on {platform}: {link}.
isDefaultbooleanNoMake 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": { ... } }.

StatusBody
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-default

No 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" }.