> **Building with AI coding agents?** Install the authstack plugin with one command. This equips your agent with accurate Scalekit implementation patterns.
>
> **Recommended** (the `-y` flags skip prompts, so the command runs without an interactive terminal):
> ```bash
> npx -y @scalekit-inc/cli setup -y
> ```
>
> Global:
> ```bash
> npm install -g @scalekit-inc/cli
> scalekit setup -y
> ```
>
> Supports Claude Code, Cursor, GitHub Copilot, Codex + skills for other Agent Skills-compatible agents in `~/.agents/skills`.
> Skills: integrate-agentkit, implement-saaskit, add-mcp-oauth, implement-sso, implement-scim.
> [Full setup guide](https://docs.scalekit.com/dev-kit/build-with-ai/)

---

# Connect AI agents to Ordinal

The Ordinal connector lets your AI agent act in each user's Ordinal account. Each user connects their own Ordinal access token once, and Scalekit sends it with every call, so your agent never handles credentials. It comes with 56 tools.

**Authentication:** Bearer Token
**Categories:** Marketing, Productivity
**Tools:** 56: 29 read, 21 write, 6 destructive
**Users sign in with:** Access token
**Built by:** Scalekit connector
**Try it:** [Playground in the Scalekit dashboard](https://app.scalekit.com/ws/signup?sk_intent=playground&provider=ORDINAL)

## Setup

1. ### Install the SDK

   **Node.js**

   ```bash
   npm install @scalekit-sdk/node dotenv
   ```

   **Python**

   ```bash
   pip install scalekit-sdk-python python-dotenv
   ```

2. ### Set your credentials

   Add your Scalekit credentials to your `.env` file. Find values in **[app.scalekit.com](https://app.scalekit.com)** > **Developers** > **API Credentials**.

   ```sh title=".env"
   SCALEKIT_ENVIRONMENT_URL=<your-environment-url>
   SCALEKIT_CLIENT_ID=<your-client-id>
   SCALEKIT_CLIENT_SECRET=<your-client-secret>
   ```

3. ### Create the Ordinal connection

   In **AgentKit > Connections**, create an Ordinal connection. The name you give it is the `connection_name` your code passes. See [Configure connections](/agentkit/connections/).

4. ### Authorize a user and make your first call

   **Node.js** (`quickstart.mts`)

   ```typescript
   import { ScalekitClient } from '@scalekit-sdk/node'
   import 'dotenv/config'
   import { createInterface } from 'node:readline/promises'

   const scalekit = new ScalekitClient(
     process.env.SCALEKIT_ENVIRONMENT_URL,
     process.env.SCALEKIT_CLIENT_ID,
     process.env.SCALEKIT_CLIENT_SECRET,
   )
   const actions = scalekit.actions

   const connector = 'ordinal'
   const identifier = 'user_123'

   // Generate an authorization link for the user
   const { link } = await actions.getAuthorizationLink({ connectionName: connector, identifier })
   console.log('Authorize Ordinal:', link)
   const rl = createInterface({ input: process.stdin, output: process.stdout })
   await rl.question('Press Enter after authorizing...')
   rl.close()

   // Make your first call
   const result = await actions.executeTool({
     connector,
     identifier,
     toolName: 'ordinal_approvals_list',
     toolInput: {},
   })
   console.log(result)
   ```

   ```bash
   npx tsx quickstart.mts
   ```

   **Python** (`quickstart.py`)

   ```python
   import os
   from scalekit import ScalekitClient
   from dotenv import load_dotenv
   load_dotenv()

   scalekit_client = ScalekitClient(
       env_url=os.getenv("SCALEKIT_ENVIRONMENT_URL"),
       client_id=os.getenv("SCALEKIT_CLIENT_ID"),
       client_secret=os.getenv("SCALEKIT_CLIENT_SECRET"),
   )
   actions = scalekit_client.actions

   connection_name = "ordinal"
   identifier = "user_123"

   # Generate an authorization link for the user
   link_response = actions.get_authorization_link(
       connection_name=connection_name,
       identifier=identifier,
   )
   print("Authorize Ordinal:", link_response.link)
   input("Press Enter after authorizing...")

   # Make your first call
   result = actions.execute_tool(
       tool_input={},
       tool_name="ordinal_approvals_list",
       connection_name=connection_name,
       identifier=identifier,
   )
   print(result)
   ```

   ```bash
   python quickstart.py
   ```

   Each user opens the link once and enters their Ordinal credentials there. See [Authorize a user](/agentkit/tools/authorize/) for the full flow and statuses.

## Tools

Pass the exact name to `execute_tool`, with an input like each tool's example. To ask for a tool that's missing, use the [request form](https://scalekitsupport.portal.usepylon.com/forms/request-a-connector-tool).

**Node.js**

```typescript
const result = await actions.executeTool({
  toolName: 'ordinal_approvals_list',
  toolInput: {},
  connector: 'ordinal',
  identifier: 'user_123',
})
```

**Python**

```python
result = actions.execute_tool(
    tool_name="ordinal_approvals_list",
    tool_input={},
    connection_name="ordinal",
    identifier="user_123",
)
```

`result.data` is the app's response as JSON, and `result.execution_id` (`executionId` in Node.js) is the ID of the call.

### `ordinal_approvals_list`

List Workspace Approvals · Read-only

List approval requests across the workspace, filtered by status, post, approver, requester or time.
Returns an approvals array (id, status, isBlocking, message, dueDate, approvedAt, createdAt, updatedAt, user, requestedBy and the post) with a nextCursor for paging.
Use this to see what is waiting for review. Use ordinal_post_approvals_list for a single post.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `approver_ids` (`array`, optional): Only approvals assigned to these user UUIDs.
- `created_at_max` (`string`, optional): Only approvals created at or before this date-time (ISO 8601).
- `created_at_min` (`string`, optional): Only approvals created at or after this date-time (ISO 8601).
- `cursor` (`string`, optional): Pagination cursor from the previous response's nextCursor, in the form timestampMs:approvalId. Keep the same sort_by and sort_order while paging.
- `limit` (`integer`, optional): Maximum number of approvals to return (1-100). Defaults to 20 when omitted.
- `post_ids` (`array`, optional): Only approvals on these post UUIDs.
- `requested_by_ids` (`array`, optional): Only approvals requested by these user UUIDs.
- `sort_by` (`string`, optional): Field to sort by: createdAt or updatedAt. Use updatedAt with sort_order asc for incremental sync. Defaults to createdAt. One of: `createdAt`, `updatedAt`.
- `sort_order` (`string`, optional): Sort direction. Defaults to desc (newest first). One of: `asc`, `desc`.
- `statuses` (`array`, optional): Only approvals with these statuses: Requested and/or Approved.
- `updated_at_max` (`string`, optional): Only approvals updated at or before this date-time (ISO 8601).
- `updated_at_min` (`string`, optional): Only approvals updated at or after this date-time (ISO 8601).

Example input: `{}`

### `ordinal_cpm_get`

Get CPM Values · Read-only

Get the CPM values the workspace uses to calculate earned media value, per platform.
Returns linkedIn, x, instagram, facebook and threads CPM numbers.
Use ordinal_cpm_update to change them.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs: none.

Example input: `{}`

### `ordinal_engagement_profiles_list`

List Engagement Profiles · Read-only

List the engagement-only social profiles in the workspace, which are used for team likes, comments and reposts but not for scheduling.
Returns each profile's id, name, detail, channel, profileImageUrl, isReintegrationRequired, createdAt and createdBy.
Use this to find profile ids for ordinal_post_engagements_create. Use ordinal_scheduling_profiles_list for profiles that can publish posts.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs: none.

Example input: `{}`

### `ordinal_idea_get`

Get Idea · Read-only

Get one idea from the backlog by id, including its per-channel content.
Returns an idea object with id, url, title, channels, status (always Idea), createdAt, updatedAt and the linkedIn, x, tikTok and youTubeShorts content that applies.
Use ordinal_ideas_list to find ideas.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `idea_id` (`string`, required): ID of the idea (UUID).

Example input: `{"idea_id":"<idea_id>"}`

### `ordinal_ideas_list`

List Ideas · Read-only

List ideas from the workspace backlog, filtered by channel, profile, label or creation date.
Returns an ideas array (id, url, title, channels, status, createdAt, updatedAt and per-channel content) plus nextCursor and hasMore.
Use this to browse the backlog. Use ordinal_idea_get for one idea and ordinal_posts_list for scheduled posts.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `channel` (`string`, optional): Only return ideas on this channel: LinkedIn, Twitter, TikTok or YouTubeShorts. One of: `LinkedIn`, `Twitter`, `TikTok`, `YouTubeShorts`.
- `created_at_max` (`string`, optional): Only return ideas created on or before this date-time (ISO 8601).
- `created_at_min` (`string`, optional): Only return ideas created on or after this date-time (ISO 8601).
- `cursor` (`string`, optional): Pagination cursor: the id of the last idea from the previous page (use nextCursor from the previous response).
- `ids` (`string`, optional): Fetch specific ideas by id. A single UUID or several UUIDs separated by commas.
- `label_ids` (`string`, optional): Only return ideas that have any of these labels. A single UUID or several UUIDs separated by commas.
- `limit` (`integer`, optional): Maximum number of ideas to return (1-100). Defaults to 20 when omitted.
- `linkedin_profile_id` (`string`, optional): Only return ideas for this LinkedIn profile UUID.
- `sort_order` (`string`, optional): Sort direction. Defaults to desc (newest first). One of: `asc`, `desc`.
- `tiktok_profile_id` (`string`, optional): Only return ideas for this TikTok profile UUID.
- `x_profile_id` (`string`, optional): Only return ideas for this X (Twitter) profile UUID.
- `youtube_profile_id` (`string`, optional): Only return ideas for this YouTube channel profile UUID.

Example input: `{}`

### `ordinal_instagram_locations_search`

Search Instagram Locations · Read-only

Search for Instagram locations by name so they can be tagged on a post.
Returns a locations array with pageId, name, address, coordinates, profileImageUrl, link and isVerified.
Use the pageId and name in the location object of an Instagram Feed or Reel post.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `query` (`string`, required): Location name to search for, at least one character.

Example input: `{"query":"<query>"}`

### `ordinal_labels_list`

List Labels · Read-only

List all labels defined in the workspace.
Returns a labels array with each label's id, name, color, backgroundColor, createdAt and updatedAt.
Use this to find label ids for the label_ids input of post and idea tools.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs: none.

Example input: `{}`

### `ordinal_linkedin_followers_analytics_list`

List LinkedIn Follower Growth · Read-only

Get daily follower counts for a LinkedIn profile over a date range.
Returns an array of data points with followerCount and recordedAt.
Use ordinal_linkedin_posts_analytics_list for post performance.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `profile_id` (`string`, required): ID of the LinkedIn profile (UUID).
- `end_date` (`string`, optional): End of the reporting window as YYYY-MM-DD. Defaults to today.
- `start_date` (`string`, optional): Start of the reporting window as YYYY-MM-DD. Defaults to 30 days ago.

Example input: `{"profile_id":"<profile_id>"}`

### `ordinal_linkedin_mention_get`

Get LinkedIn Mention Format · Read-only

Get the mention string for a LinkedIn user or company from its username (vanity name).
Returns a user or organization object with username, urn, displayName, and mentionFormat such as @[Acme Inc](urn:li:organization:123456); users also have firstName and firstNameMentionFormat.
Paste the mentionFormat into LinkedIn copy of ordinal_post_create to tag someone.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `username` (`string`, required): LinkedIn username (vanity name) to look up, the part after linkedin.com/in/ or linkedin.com/company/.

Example input: `{"username":"<username>"}`

### `ordinal_linkedin_posts_analytics_list`

List LinkedIn Post Analytics · Read-only

Get post-level performance metrics for a LinkedIn profile over a date range.
Returns an array of posts with id, url, commentary, type, publishedAt, likeCount, commentCount, shareCount, clickCount, impressionCount, engagement rate, earned media value and the linked Ordinal post when present.
Use ordinal_scheduling_profiles_list to find the profile id. Use ordinal_linkedin_followers_analytics_list for follower growth.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `profile_id` (`string`, required): ID of the LinkedIn profile (UUID).
- `end_date` (`string`, optional): End of the reporting window as YYYY-MM-DD. Defaults to today.
- `start_date` (`string`, optional): Start of the reporting window as YYYY-MM-DD. Defaults to 30 days ago.

Example input: `{"profile_id":"<profile_id>"}`

### `ordinal_linkedin_profile_get`

Get LinkedIn Profile by URN · Read-only

Look up a LinkedIn person or organization by URN.
Returns urn, username (vanity name), name, profileImageUrl and type (User or Organization).
Use ordinal_linkedin_mention_get when you only have a username and need a ready-made mention string.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `urn` (`string`, required): LinkedIn URN of the person or organization, urn:li:person:<id> or urn:li:organization:<id>.

Example input: `{"urn":"<urn>"}`

### `ordinal_post_approvals_list`

List Post Approvals · Read-only

List the approval requests on a single post.
Returns an approvals array with each approval's id, status (Requested or Approved), isBlocking, message, dueDate, approvedAt, createdAt, user and requestedBy.
Use ordinal_approvals_list to search approvals across the whole workspace.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `post_id` (`string`, required): ID of the post (UUID).

Example input: `{"post_id":"<post_id>"}`

### `ordinal_post_comments_list`

List Post Comments · Read-only

List the post-level comments on a post.
Returns a comments array with each comment's id, message, postId, createdAt, updatedAt and user (id, firstName, lastName, email).
Use ordinal_post_inline_comments_list for comments anchored to highlighted text.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `post_id` (`string`, required): ID of the post (UUID).

Example input: `{"post_id":"<post_id>"}`

### `ordinal_post_engagements_list`

List Post Engagements · Read-only

List the planned team engagements (likes, comments, reposts) on a post.
Returns an engagements array with each engagement's id, channel, type, profileId, copy, delaySeconds and reactionType.
Use ordinal_post_engagements_create to add engagements.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `post_id` (`string`, required): ID of the post (UUID).

Example input: `{"post_id":"<post_id>"}`

### `ordinal_post_get`

Get Post · Read-only

Get one post by id, including its per-channel content and attached assets.
Returns a post object with id, url, title, channels, status, publishDate, publishAt, createdAt, updatedAt, archivedAt, labels and the linkedIn, x, instagram, tikTok and youTubeShorts content that applies.
Use ordinal_posts_list to find posts. Use ordinal_post_versions_list for draft history.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `post_id` (`string`, required): ID of the post (UUID).

Example input: `{"post_id":"<post_id>"}`

### `ordinal_post_inline_comments_list`

List Post Inline Comments · Read-only

List text-anchored inline comment threads on a post, optionally by channel or resolution state.
Returns an inlineComments array; each thread has id, resolved, channel, highlightedText, replies (with user, message, createdAt, reactions), createdAt and updatedAt.
Use ordinal_post_comments_list for post-level comments.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `post_id` (`string`, required): ID of the post (UUID).
- `channel` (`string`, optional): Only return threads on this channel. One of: `LinkedIn`, `Twitter`, `Instagram`, `Facebook`, `Threads`, `TikTok`, `Discord`, `Slack`, `Webflow`, `YouTubeShorts`.
- `resolved` (`boolean`, optional): true for resolved threads only, false for unresolved only. Omit for both.

Example input: `{"post_id":"<post_id>"}`

### `ordinal_post_slack_boosts_list`

List Post Slack Boosts · Read-only

List the Slack boosts attached to a post, which post a Slack message when the post publishes.
Returns a slackBoosts array with each boost's id, copy, isAutoCreated, postId, slackWebhook, createdAt and updatedAt.
Use ordinal_slack_boost_get for one boost.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `post_id` (`string`, required): ID of the post (UUID).

Example input: `{"post_id":"<post_id>"}`

### `ordinal_post_subscribers_list`

List Post Subscribers · Read-only

List the users subscribed to notifications for a post.
Returns a subscribers array with each subscriber's id, user (id, firstName, lastName), createdBy and createdAt.
Use ordinal_subscribers_create to add subscribers.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `post_id` (`string`, required): ID of the post (UUID).

Example input: `{"post_id":"<post_id>"}`

### `ordinal_post_version_content_get`

Get Post Version Content · Read-only

Read the plain-text copy of one saved draft version of a post for a channel.
Returns postId, channel, versionId and copy.
Use ordinal_post_versions_list first to get the versionId.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `channel` (`string`, required): Channel whose editor version to read. One of: `LinkedIn`, `Facebook`, `Instagram`, `TikTok`, `Discord`, `Slack`, `Webflow`, `YouTubeShorts`.
- `post_id` (`string`, required): ID of the post (UUID).
- `version_id` (`string`, required): Version id returned by ordinal_post_versions_list.

Example input: `{"channel":"LinkedIn","post_id":"<post_id>","version_id":"<version_id>"}`

### `ordinal_post_versions_list`

List Post Draft Versions · Read-only

List the saved draft versions of a post's copy, grouped by channel and newest first.
Returns postId and a channels array; each channel has versions (id, createdAt, authors) and nextCursor, and may carry an error if that channel's history failed to load.
Use this to find a versionId, then ordinal_post_version_content_get to read that version's text.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `post_id` (`string`, required): ID of the post (UUID).
- `channel` (`string`, optional): Only return versions for this channel. Required when cursor is set. One of: `LinkedIn`, `Facebook`, `Instagram`, `TikTok`, `Discord`, `Slack`, `Webflow`, `YouTubeShorts`.
- `cursor` (`string`, optional): Pagination cursor from a previous response's channels[].nextCursor. Requires channel.
- `limit` (`integer`, optional): Maximum versions returned per channel, newest first (1-100). Defaults to 15.

Example input: `{"post_id":"<post_id>"}`

### `ordinal_posts_list`

List Posts · Read-only

List posts in the workspace, filtered by status, channel, profile, label or date and sorted by creation or publish time.
Returns a posts array (id, url, title, channels, status, publishDate, publishAt, labels and per-channel content with assets) plus nextCursor and hasMore for pagination.
Use this to browse or search posts. Use ordinal_post_get when you already have a post id.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `channel` (`string`, optional): Only return posts on this channel: LinkedIn, Twitter, Instagram, TikTok or YouTubeShorts. One of: `LinkedIn`, `Twitter`, `Instagram`, `TikTok`, `YouTubeShorts`.
- `created_at_max` (`string`, optional): Only return posts created on or before this date-time (ISO 8601).
- `created_at_min` (`string`, optional): Only return posts created on or after this date-time (ISO 8601).
- `cursor` (`string`, optional): Pagination cursor: the id of the last post from the previous page (use nextCursor from the previous response).
- `ids` (`string`, optional): Fetch specific posts by id. A single UUID or several UUIDs separated by commas.
- `instagram_profile_id` (`string`, optional): Only return posts for this Instagram profile UUID.
- `label_ids` (`string`, optional): Only return posts that have any of these labels. A single UUID or several UUIDs separated by commas.
- `limit` (`integer`, optional): Maximum number of posts to return (1-100). Defaults to 20 when omitted.
- `linkedin_profile_id` (`string`, optional): Only return posts for this LinkedIn profile UUID.
- `publish_date_max` (`string`, optional): Only return posts scheduled on or before this date-time (ISO 8601).
- `publish_date_min` (`string`, optional): Only return posts scheduled on or after this date-time (ISO 8601).
- `sort_by` (`string`, optional): Field to sort by: createdAt or publishAt. Defaults to createdAt. One of: `createdAt`, `publishAt`.
- `sort_order` (`string`, optional): Sort direction. Defaults to desc (newest first). One of: `asc`, `desc`.
- `status` (`string`, optional): Workflow status of the post: Tentative, ToDo, InProgress, ForReview, Blocked, Finalized, Scheduled or Posted. One of: `Tentative`, `ToDo`, `InProgress`, `ForReview`, `Blocked`, `Finalized`, `Scheduled`, `Posted`.
- `tiktok_profile_id` (`string`, optional): Only return posts for this TikTok profile UUID.
- `x_profile_id` (`string`, optional): Only return posts for this X (Twitter) profile UUID.
- `youtube_profile_id` (`string`, optional): Only return posts for this YouTube channel profile UUID.

Example input: `{}`

### `ordinal_scheduling_profiles_list`

List Scheduling Profiles · Read-only

List the social profiles in the workspace that posts can be scheduled to.
Returns each profile's id, name, detail, channel, profileImageUrl, isReintegrationRequired, createdAt, createdBy and isLeadsScrapingEnabled.
Use this to find the profile ids needed by ordinal_post_create and analytics tools. Use ordinal_engagement_profiles_list for engagement-only profiles.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs: none.

Example input: `{}`

### `ordinal_slack_boost_get`

Get Slack Boost · Read-only

Get one Slack boost by id.
Returns a slackBoost with id, copy, isAutoCreated, postId, slackWebhook (id, channelName, teamName), createdAt and updatedAt.
Use ordinal_post_slack_boosts_list to find boost ids.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `boost_id` (`string`, required): ID of the Slack boost (UUID).

Example input: `{"boost_id":"<boost_id>"}`

### `ordinal_slack_webhooks_list`

List Slack Webhooks · Read-only

List the Slack channels (webhooks) connected to the workspace.
Returns a slackWebhooks array with each webhook's id, channelName, teamName, teamIconUrl, notifyByDefault, createdAt and updatedAt.
Use this to find the slack_webhook_id for ordinal_slack_boost_create.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs: none.

Example input: `{}`

### `ordinal_upload_get`

Get Upload Status · Read-only

Check the status of an upload job.
Returns id, status (awaiting_upload, pending, processing, ready, failed or expired) and createdAt; when ready it also returns assetId, filename, mimetype, size, width, height, duration, expiresAt and readyAt, and when failed an error message.
Use the assetId from a ready upload when creating posts. Start uploads with ordinal_upload_create.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `upload_id` (`string`, required): ID of the upload job (UUID).

Example input: `{"upload_id":"<upload_id>"}`

### `ordinal_users_list`

List Workspace Users · Read-only

List the users who are members of the workspace.
Returns each user's id, email, firstName and lastName.
Use this to find user ids for approvals, subscribers and @mentions in comments.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs: none.

Example input: `{}`

### `ordinal_workspace_get`

Get Workspace · Read-only

Get the Ordinal workspace that the connected API key belongs to.
Returns the workspace id, name, slug, timezone and createdAt.
Use this first to confirm the API key works and to read the workspace timezone before scheduling posts.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs: none.

Example input: `{}`

### `ordinal_x_followers_analytics_list`

List X Follower Growth · Read-only

Get daily follower counts for an X (Twitter) profile over a date range.
Returns an array of data points with followerCount and recordedAt.
Use ordinal_x_posts_analytics_list for post performance.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `profile_id` (`string`, required): ID of the X (Twitter) profile (UUID).
- `end_date` (`string`, optional): End of the reporting window as YYYY-MM-DD. Defaults to today.
- `start_date` (`string`, optional): Start of the reporting window as YYYY-MM-DD. Defaults to 30 days ago.

Example input: `{"profile_id":"<profile_id>"}`

### `ordinal_x_posts_analytics_list`

List X Post Analytics · Read-only

Get post-level performance metrics for an X (Twitter) profile over a date range.
Returns an array of posts with id, url, text, publishedAt, likeCount, replyCount, retweetCount, quoteCount, bookmarkCount, impressionCount, engagement rate, earned media value and the linked Ordinal post when present.
Use ordinal_scheduling_profiles_list to find the profile id. Use ordinal_x_followers_analytics_list for follower growth.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `profile_id` (`string`, required): ID of the X (Twitter) profile (UUID).
- `end_date` (`string`, optional): End of the reporting window as YYYY-MM-DD. Defaults to today.
- `start_date` (`string`, optional): Start of the reporting window as YYYY-MM-DD. Defaults to 30 days ago.

Example input: `{"profile_id":"<profile_id>"}`

### `ordinal_approvals_create`

Create Approval Requests · Write

Request approval on a post from one or more workspace users.
Returns createdApprovals (new approvals with id, status, isBlocking, message, dueDate, user, requestedBy) and existingApprovals that were already in place.
Get user ids from ordinal_users_list. A blocking approval stops the post from publishing until it is granted.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `approvals` (`array`, required): List of approval requests. Each object needs userId (the approver's UUID) and may include message, dueDate (ISO 8601 date-time) and isBlocking (boolean, default false). Example: [{"userId": "550e8400-e29b-41d4-a716-446655440011", "message": "Please review", "isBlocking": true}]
- `post_id` (`string`, required): ID of the post to request approval on (UUID).

Example input: `{"approvals":[{"userId":"550e8400-e29b-41d4-a716-446655440011","message":"Please review","isBlocking":true}],"post_id":"<post_id>"}`

### `ordinal_cpm_update`

Update CPM Values · Write

Update the workspace's per-platform CPM values used for earned media value.
Returns the updated linkedIn, x, instagram, facebook and threads CPM numbers.
Send only the platforms to change. Use ordinal_cpm_get to read the current values.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `facebook` (`number`, optional): New CPM value for Facebook, zero or greater.
- `instagram` (`number`, optional): New CPM value for Instagram, zero or greater.
- `linkedin` (`number`, optional): New CPM value for LinkedIn, zero or greater.
- `threads` (`number`, optional): New CPM value for Threads, zero or greater.
- `x` (`number`, optional): New CPM value for X, zero or greater.

Example input: `{}`

### `ordinal_engagement_update`

Update Engagement · Write

Update a planned engagement's text, delay, profile or LinkedIn reaction type.
Returns the updated engagement with id, type, profileId, copy, delaySeconds and reactionType.
Text and delay cannot be changed on Like engagements. Use ordinal_post_engagements_list to find the engagement id.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `engagement_id` (`string`, required): ID of the engagement to update (UUID).
- `copy` (`string`, optional): New text for a Comment or Repost engagement. Cannot be set on a Like.
- `delay_seconds` (`integer`, optional): Seconds to wait after the post publishes before engaging (0-86400). Cannot be set on a Like.
- `profile_id` (`string`, optional): UUID of a different profile to perform the engagement. It needs the required engagement permissions.
- `reaction_type` (`string`, optional): LinkedIn reaction for a Like engagement: Like, Celebrate, Love, Insightful, Support or Funny. One of: `Like`, `Celebrate`, `Love`, `Insightful`, `Support`, `Funny`.

Example input: `{"engagement_id":"<engagement_id>"}`

### `ordinal_idea_add_to_calendar`

Add Idea to Calendar · Write

Convert a backlog idea into a calendar post on a given date.
Returns the id of the resulting post, which is the same as the idea id.
Use ordinal_post_get with that id afterwards to read the post and ordinal_post_schedule to set a publish time.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `idea_id` (`string`, required): ID of the idea (UUID).
- `publish_date` (`string`, required): Calendar date to place the post on, as YYYY-MM-DD or an ISO 8601 date-time.

Example input: `{"idea_id":"<idea_id>","publish_date":"<publish_date>"}`

### `ordinal_idea_archive`

Archive Idea · Write

Archive an idea so it no longer shows in the backlog. It can be restored.
Returns the idea id, workspaceId and archivedAt timestamp.
Use ordinal_idea_unarchive to restore it.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `idea_id` (`string`, required): ID of the idea (UUID).

Example input: `{"idea_id":"<idea_id>"}`

### `ordinal_idea_create`

Create Idea · Write

Create an idea in the content backlog, optionally with draft content for LinkedIn, X, TikTok or YouTube Shorts.
Returns the new idea with its id, url, title, channels and stored content.
Use this to capture content before it is scheduled; use ordinal_idea_add_to_calendar to turn it into a post. Use ordinal_post_create to create a dated post directly.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `title` (`string`, required): Title of the idea.
- `campaign_id` (`string`, optional): UUID of the campaign to link the idea to.
- `label_ids` (`array`, optional): List of label UUIDs to attach to the idea. On update this replaces the existing labels.
- `linkedin` (`object`, optional): LinkedIn content for the post, as an object. Fields: profileId (LinkedIn profile UUID, from ordinal_scheduling_profiles_list), copy (post text; mention people as @[Display Name](urn)), optional documentTitle, assets (list of objects with an assetId from the Uploads tools, up to 20 images, one video or one PDF), optional poll and linkPreview. Example: {"profileId": "550e8400-e29b-41d4-a716-446655440001", "copy": "Excited to announce our launch!"}
- `tiktok` (`object`, optional): TikTok content for the post, as an object. Required: profileId, copy (caption, up to 2,200 characters) and assets (exactly one video, as an object with assetId). Optional: privacyLevel (PUBLIC_TO_EVERYONE, FOLLOWER_OF_CREATOR, MUTUAL_FOLLOW_FRIENDS or SELF_ONLY), isCommentDisabled, isDuetDisabled, isStitchDisabled, isPromotingBusiness, isPaidPartnership and videoCoverTimestampMs. Example: {"profileId": "550e8400-e29b-41d4-a716-446655440005", "copy": "Behind the scenes", "assets": [{"assetId": "550e8400-e29b-41d4-a716-446655440014"}], "privacyLevel": "PUBLIC_TO_EVERYONE"}
- `x` (`object`, optional): X (Twitter) content for the post, as an object. Fields: profileId (X profile UUID, required) and tweets (required, at least one object with copy and optional assets of up to 4 assetId references; add several tweets in order to make a thread). Example: {"profileId": "550e8400-e29b-41d4-a716-446655440003", "tweets": [{"copy": "Big news today."}, {"copy": "More details below."}]}
- `youtube_shorts` (`object`, optional): YouTube Shorts content for the post, as an object. Required: profileId, title (up to 100 characters) and assets (exactly one video of 1 second to 3 minutes, as an object with assetId). Optional: description (up to 5,000 characters), privacyStatus (public, private or unlisted), categoryId, notifySubscribers, isEmbeddable and isSelfDeclaredMadeForKids. Example: {"profileId": "550e8400-e29b-41d4-a716-446655440006", "title": "Quick tip", "assets": [{"assetId": "550e8400-e29b-41d4-a716-446655440015"}], "privacyStatus": "public"}

Example input: `{"title":"<title>"}`

### `ordinal_idea_unarchive`

Unarchive Idea · Write

Restore an archived idea to the backlog.
Returns the idea id, workspaceId and archivedAt, which is null.
Use ordinal_idea_archive to archive an idea.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `idea_id` (`string`, required): ID of the idea (UUID).

Example input: `{"idea_id":"<idea_id>"}`

### `ordinal_idea_update`

Update Idea · Write

Update an idea's title, labels, campaign or per-channel content.
Returns the updated idea with its id, url, title, channels and content.
Send only the fields to change. Use ordinal_idea_get to read the current content first.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `idea_id` (`string`, required): ID of the idea (UUID).
- `campaign_id` (`string`, optional): UUID of the campaign to link the idea to.
- `label_ids` (`array`, optional): List of label UUIDs to attach to the idea. On update this replaces the existing labels.
- `linkedin` (`object`, optional): LinkedIn content for the post, as an object. Fields: profileId (LinkedIn profile UUID, from ordinal_scheduling_profiles_list), copy (post text; mention people as @[Display Name](urn)), optional documentTitle, assets (list of objects with an assetId from the Uploads tools, up to 20 images, one video or one PDF), optional poll and linkPreview. Example: {"profileId": "550e8400-e29b-41d4-a716-446655440001", "copy": "Excited to announce our launch!"}
- `tiktok` (`object`, optional): TikTok content for the post, as an object. Required: profileId, copy (caption, up to 2,200 characters) and assets (exactly one video, as an object with assetId). Optional: privacyLevel (PUBLIC_TO_EVERYONE, FOLLOWER_OF_CREATOR, MUTUAL_FOLLOW_FRIENDS or SELF_ONLY), isCommentDisabled, isDuetDisabled, isStitchDisabled, isPromotingBusiness, isPaidPartnership and videoCoverTimestampMs. Example: {"profileId": "550e8400-e29b-41d4-a716-446655440005", "copy": "Behind the scenes", "assets": [{"assetId": "550e8400-e29b-41d4-a716-446655440014"}], "privacyLevel": "PUBLIC_TO_EVERYONE"}
- `title` (`string`, optional): New title of the idea (at least one character).
- `x` (`object`, optional): X (Twitter) content for the post, as an object. Fields: profileId (X profile UUID, required) and tweets (required, at least one object with copy and optional assets of up to 4 assetId references; add several tweets in order to make a thread). Example: {"profileId": "550e8400-e29b-41d4-a716-446655440003", "tweets": [{"copy": "Big news today."}, {"copy": "More details below."}]}
- `youtube_shorts` (`object`, optional): YouTube Shorts content for the post, as an object. Required: profileId, title (up to 100 characters) and assets (exactly one video of 1 second to 3 minutes, as an object with assetId). Optional: description (up to 5,000 characters), privacyStatus (public, private or unlisted), categoryId, notifySubscribers, isEmbeddable and isSelfDeclaredMadeForKids. Example: {"profileId": "550e8400-e29b-41d4-a716-446655440006", "title": "Quick tip", "assets": [{"assetId": "550e8400-e29b-41d4-a716-446655440015"}], "privacyStatus": "public"}

Example input: `{"idea_id":"<idea_id>"}`

### `ordinal_label_create`

Create Label · Write

Create a label in the workspace for organizing posts and ideas.
Returns the new label's id, name, color (hex), backgroundColor (hex), createdAt and updatedAt. Fails with a conflict if a label with that name already exists.
Use ordinal_labels_list first to check whether the label already exists.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `color` (`string`, required): Label color. One of yellow, purple, orange, red, brown, green. One of: `yellow`, `purple`, `orange`, `red`, `brown`, `green`.
- `name` (`string`, required): Label name, at least one character. Must be unique in the workspace.

Example input: `{"color":"yellow","name":"<name>"}`

### `ordinal_post_archive`

Archive Post · Write

Archive a post, which moves it to the trash. The post can be restored.
Returns the post id, workspaceId and archivedAt timestamp.
Use ordinal_post_unarchive to restore it.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `post_id` (`string`, required): ID of the post (UUID).

Example input: `{"post_id":"<post_id>"}`

### `ordinal_post_comment_create`

Create Post Comment · Write

Add a comment to a post as the API key's user.
Returns the new comment with id, message, postId, createdAt, updatedAt and user.
Mention a teammate with @[Display Name](userId), using ids from ordinal_users_list. Use ordinal_post_comments_list to read existing comments.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `message` (`string`, required): Comment text, at least one character. Mention users as @[Display Name](userId).
- `post_id` (`string`, required): ID of the post (UUID).

Example input: `{"message":"<message>","post_id":"<post_id>"}`

### `ordinal_post_create`

Create Post · Write

Create a post in the workspace for one or more channels (LinkedIn, X, Instagram, TikTok, YouTube Shorts).
Returns the new post's id, url, title, channels, status, createdAt, updatedAt and the stored per-channel content with assets.
Use this to draft or schedule new content; at least one channel object is required. Upload media first with ordinal_upload_create and pass the resulting assetId. Use ordinal_post_update to edit an existing post.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `publish_at` (`string`, required): When the post is scheduled to publish, as an ISO 8601 date-time in UTC.
- `status` (`string`, required): Workflow status of the post: Tentative, ToDo, InProgress, ForReview, Blocked, Finalized, Scheduled or Posted. One of: `Tentative`, `ToDo`, `InProgress`, `ForReview`, `Blocked`, `Finalized`, `Scheduled`, `Posted`.
- `title` (`string`, required): Internal title of the post, shown in the Ordinal calendar.
- `campaign_id` (`string`, optional): UUID of the campaign to link the post to.
- `instagram` (`object`, optional): Instagram content for the post, as an object. The type field is required and must be Feed, Reel or Story. Common fields: profileId, copy (caption, up to 2,200 characters), assets (list of objects with assetId and, for Feed, optional user tags). Reels also take coverPhotoId, shareToFeed, trialReelGraduationStrategy; Feed and Reels take collaborators (up to 3 usernames) and location (pageId and name from ordinal_instagram_locations_search). Example: {"profileId": "550e8400-e29b-41d4-a716-446655440004", "type": "Feed", "copy": "New drop!", "assets": [{"assetId": "550e8400-e29b-41d4-a716-446655440012"}]}
- `label_ids` (`array`, optional): List of label UUIDs to attach to the post. On update this replaces the existing labels.
- `linkedin` (`object`, optional): LinkedIn content for the post, as an object. Fields: profileId (LinkedIn profile UUID, from ordinal_scheduling_profiles_list), copy (post text; mention people as @[Display Name](urn)), optional documentTitle, assets (list of objects with an assetId from the Uploads tools, up to 20 images, one video or one PDF), optional poll and linkPreview. Example: {"profileId": "550e8400-e29b-41d4-a716-446655440001", "copy": "Excited to announce our launch!"}
- `notes` (`string`, optional): Internal notes for the team. Not published.
- `tiktok` (`object`, optional): TikTok content for the post, as an object. Required: profileId, copy (caption, up to 2,200 characters) and assets (exactly one video, as an object with assetId). Optional: privacyLevel (PUBLIC_TO_EVERYONE, FOLLOWER_OF_CREATOR, MUTUAL_FOLLOW_FRIENDS or SELF_ONLY), isCommentDisabled, isDuetDisabled, isStitchDisabled, isPromotingBusiness, isPaidPartnership and videoCoverTimestampMs. Example: {"profileId": "550e8400-e29b-41d4-a716-446655440005", "copy": "Behind the scenes", "assets": [{"assetId": "550e8400-e29b-41d4-a716-446655440014"}], "privacyLevel": "PUBLIC_TO_EVERYONE"}
- `x` (`object`, optional): X (Twitter) content for the post, as an object. Fields: profileId (X profile UUID, required) and tweets (required, at least one object with copy and optional assets of up to 4 assetId references; add several tweets in order to make a thread). Example: {"profileId": "550e8400-e29b-41d4-a716-446655440003", "tweets": [{"copy": "Big news today."}, {"copy": "More details below."}]}
- `youtube_shorts` (`object`, optional): YouTube Shorts content for the post, as an object. Required: profileId, title (up to 100 characters) and assets (exactly one video of 1 second to 3 minutes, as an object with assetId). Optional: description (up to 5,000 characters), privacyStatus (public, private or unlisted), categoryId, notifySubscribers, isEmbeddable and isSelfDeclaredMadeForKids. Example: {"profileId": "550e8400-e29b-41d4-a716-446655440006", "title": "Quick tip", "assets": [{"assetId": "550e8400-e29b-41d4-a716-446655440015"}], "privacyStatus": "public"}

Example input: `{"publish_at":"<publish_at>","status":"Tentative","title":"<title>"}`

### `ordinal_post_engagements_create`

Create Post Engagements · Write

Plan team engagements (likes, comments or reposts) that fire automatically after a post publishes.
Returns the created engagements with id, channel, type, profileId, copy, delaySeconds and reactionType.
Use ordinal_engagement_profiles_list or ordinal_scheduling_profiles_list for profile ids. Use ordinal_engagement_update to change one later.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `channel` (`string`, required): Channel the engagements are for: LinkedIn or Twitter. One of: `LinkedIn`, `Twitter`.
- `engagements` (`array`, required): List of engagements to create (at least one). Each object needs type (Like, Comment or Repost) and profileId (the profile that engages). Comment needs copy and delaySeconds (0-86400); Repost needs delaySeconds and may have copy; Like takes neither, and may set reactionType on LinkedIn (Like, Celebrate, Love, Insightful, Support or Funny). Example: [{"type": "Comment", "profileId": "550e8400-e29b-41d4-a716-446655440002", "copy": "Great post!", "delaySeconds": 600}]
- `post_id` (`string`, required): ID of the post (UUID).

Example input: `{"channel":"LinkedIn","engagements":[{"type":"Comment","profileId":"550e8400-e29b-41d4-a716-446655440002","copy":"Great post!","delaySeconds":600}],"post_id":"<post_id>"}`

### `ordinal_post_schedule`

Schedule Post · Write

Schedule a post for publishing, or move an already scheduled post to a new time.
Returns the post's id, url, title, channels, status, publishDate, publishAt and updatedAt.
Use this to set or change the publish time. Use ordinal_post_unschedule to take a post off the schedule.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `post_id` (`string`, required): ID of the post (UUID).
- `publish_at` (`string`, required): When to publish the post, as an ISO 8601 date-time in UTC. To keep the existing time when rescheduling, pass the post's current publishAt.

Example input: `{"post_id":"<post_id>","publish_at":"<publish_at>"}`

### `ordinal_post_unarchive`

Unarchive Post · Write

Restore an archived post from the trash.
Returns the post id, workspaceId and archivedAt, which is always null.
Use ordinal_post_archive to archive a post.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `post_id` (`string`, required): ID of the post (UUID).

Example input: `{"post_id":"<post_id>"}`

### `ordinal_post_unschedule`

Unschedule Post · Write

Remove a post from the publishing schedule without deleting it.
Returns the post's id, url, title, channels, status, publishDate, publishAt and updatedAt; publishDate and publishAt may be null.
Use ordinal_post_schedule to schedule it again. Use ordinal_post_archive to remove the post from the calendar.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `post_id` (`string`, required): ID of the post (UUID).

Example input: `{"post_id":"<post_id>"}`

### `ordinal_post_update`

Update Post · Write

Update an existing post's title, publish time, status, labels, notes or per-channel content.
Returns the updated post with its id, url, title, channels, status and per-channel content.
Use this to edit a post. Send only the fields you want to change. Use ordinal_post_schedule or ordinal_post_unschedule to change scheduling alone.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `post_id` (`string`, required): ID of the post (UUID).
- `campaign_id` (`string`, optional): UUID of the campaign to link the post to.
- `instagram` (`object`, optional): Instagram content for the post, as an object. The type field is required and must be Feed, Reel or Story. Common fields: profileId, copy (caption, up to 2,200 characters), assets (list of objects with assetId and, for Feed, optional user tags). Reels also take coverPhotoId, shareToFeed, trialReelGraduationStrategy; Feed and Reels take collaborators (up to 3 usernames) and location (pageId and name from ordinal_instagram_locations_search). Example: {"profileId": "550e8400-e29b-41d4-a716-446655440004", "type": "Feed", "copy": "New drop!", "assets": [{"assetId": "550e8400-e29b-41d4-a716-446655440012"}]}
- `label_ids` (`array`, optional): List of label UUIDs to attach to the post. On update this replaces the existing labels.
- `linkedin` (`object`, optional): LinkedIn content for the post, as an object. Fields: profileId (LinkedIn profile UUID, from ordinal_scheduling_profiles_list), copy (post text; mention people as @[Display Name](urn)), optional documentTitle, assets (list of objects with an assetId from the Uploads tools, up to 20 images, one video or one PDF), optional poll and linkPreview. Example: {"profileId": "550e8400-e29b-41d4-a716-446655440001", "copy": "Excited to announce our launch!"}
- `notes` (`string`, optional): New internal notes for the team.
- `publish_at` (`string`, optional): New publish time as an ISO 8601 date-time in UTC.
- `status` (`string`, optional): Workflow status of the post: Tentative, ToDo, InProgress, ForReview, Blocked, Finalized, Scheduled or Posted. One of: `Tentative`, `ToDo`, `InProgress`, `ForReview`, `Blocked`, `Finalized`, `Scheduled`, `Posted`.
- `tiktok` (`object`, optional): TikTok content for the post, as an object. Required: profileId, copy (caption, up to 2,200 characters) and assets (exactly one video, as an object with assetId). Optional: privacyLevel (PUBLIC_TO_EVERYONE, FOLLOWER_OF_CREATOR, MUTUAL_FOLLOW_FRIENDS or SELF_ONLY), isCommentDisabled, isDuetDisabled, isStitchDisabled, isPromotingBusiness, isPaidPartnership and videoCoverTimestampMs. Example: {"profileId": "550e8400-e29b-41d4-a716-446655440005", "copy": "Behind the scenes", "assets": [{"assetId": "550e8400-e29b-41d4-a716-446655440014"}], "privacyLevel": "PUBLIC_TO_EVERYONE"}
- `title` (`string`, optional): New internal title of the post.
- `x` (`object`, optional): X (Twitter) content for the post, as an object. Fields: profileId (X profile UUID, required) and tweets (required, at least one object with copy and optional assets of up to 4 assetId references; add several tweets in order to make a thread). Example: {"profileId": "550e8400-e29b-41d4-a716-446655440003", "tweets": [{"copy": "Big news today."}, {"copy": "More details below."}]}
- `youtube_shorts` (`object`, optional): YouTube Shorts content for the post, as an object. Required: profileId, title (up to 100 characters) and assets (exactly one video of 1 second to 3 minutes, as an object with assetId). Optional: description (up to 5,000 characters), privacyStatus (public, private or unlisted), categoryId, notifySubscribers, isEmbeddable and isSelfDeclaredMadeForKids. Example: {"profileId": "550e8400-e29b-41d4-a716-446655440006", "title": "Quick tip", "assets": [{"assetId": "550e8400-e29b-41d4-a716-446655440015"}], "privacyStatus": "public"}

Example input: `{"post_id":"<post_id>"}`

### `ordinal_slack_boost_create`

Create Slack Boost · Write

Attach a Slack boost to a post so a Slack channel is notified when the post publishes.
Returns the new slackBoost with id, copy, isAutoCreated, postId, slackWebhook, createdAt and updatedAt.
Use ordinal_slack_webhooks_list to find the channel to notify.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `post_id` (`string`, required): ID of the post to attach the boost to (UUID).
- `slack_webhook_id` (`string`, required): ID of the Slack webhook (channel) to notify (UUID).
- `copy` (`string`, optional): Optional custom message included in the Slack notification.

Example input: `{"post_id":"<post_id>","slack_webhook_id":"<slack_webhook_id>"}`

### `ordinal_slack_boost_update`

Update Slack Boost · Write

Change a Slack boost's custom message or target Slack channel.
Returns the updated slackBoost with id, copy, isAutoCreated, postId, slackWebhook and updatedAt.
Send only the fields to change.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `boost_id` (`string`, required): ID of the Slack boost to update (UUID).
- `copy` (`string`, optional): New custom message for the Slack notification.
- `slack_webhook_id` (`string`, optional): ID of a different Slack webhook (channel) to notify (UUID).

Example input: `{"boost_id":"<boost_id>"}`

### `ordinal_subscribers_create`

Add Post Subscribers · Write

Subscribe workspace users to notifications for a post.
Returns createdSubscribers (new subscriptions) and existingSubscribers that were already subscribed.
Get user ids from ordinal_users_list.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `post_id` (`string`, required): ID of the post to subscribe users to (UUID).
- `user_ids` (`array`, required): List of workspace user UUIDs to subscribe.

Example input: `{"post_id":"<post_id>","user_ids":[]}`

### `ordinal_upload_create`

Upload File From URL · Write

Start an asynchronous upload of an image, video, GIF or PDF from a public URL into Ordinal.
Returns the upload job id, a pending status and createdAt.
Poll ordinal_upload_get until the status is ready, then pass its assetId in the assets of ordinal_post_create or ordinal_post_update.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `url` (`string`, required): Publicly accessible URL of the file to upload. URLs behind authentication will fail. Supported: JPEG, PNG, GIF, WebP, MP4, MOV and PDF (LinkedIn only).

Example input: `{"url":"<url>"}`

### `ordinal_approval_delete`

Delete Approval · Destructive

Delete an approval request by id.
Returns deletedApproval with its id, status, isBlocking, message, dueDate, approvedAt, user and requestedBy.
Use ordinal_post_approvals_list to find the approval id.

Read only: no. Destructive: yes. Idempotent (safe to retry): yes.

Inputs:

- `approval_id` (`string`, required): ID of the approval to delete (UUID).

Example input: `{"approval_id":"<approval_id>"}`

### `ordinal_comment_delete`

Delete Comment · Destructive

Delete a post comment by id.
Returns the deleted comment's id, message, postId, createdAt, updatedAt and user.
Use ordinal_post_comments_list to find the comment id.

Read only: no. Destructive: yes. Idempotent (safe to retry): yes.

Inputs:

- `comment_id` (`string`, required): ID of the comment to delete (UUID).

Example input: `{"comment_id":"<comment_id>"}`

### `ordinal_engagement_delete`

Delete Engagement · Destructive

Delete a planned engagement by id.
Returns success as a boolean.
Use ordinal_post_engagements_list to find the engagement id.

Read only: no. Destructive: yes. Idempotent (safe to retry): yes.

Inputs:

- `engagement_id` (`string`, required): ID of the engagement to delete (UUID).

Example input: `{"engagement_id":"<engagement_id>"}`

### `ordinal_label_delete`

Delete Label · Destructive

Delete a label from the workspace.
Returns the deleted label's id, name, color, backgroundColor, createdAt and updatedAt.
Use ordinal_labels_list to find the label id. This permanently removes the label from every post and idea that uses it.

Read only: no. Destructive: yes. Idempotent (safe to retry): yes.

Inputs:

- `label_id` (`string`, required): ID of the label to delete (UUID).

Example input: `{"label_id":"<label_id>"}`

### `ordinal_slack_boost_delete`

Delete Slack Boost · Destructive

Delete a Slack boost from a post.
Returns success as a boolean.
Use ordinal_post_slack_boosts_list to find the boost id.

Read only: no. Destructive: yes. Idempotent (safe to retry): yes.

Inputs:

- `boost_id` (`string`, required): ID of the Slack boost to delete (UUID).

Example input: `{"boost_id":"<boost_id>"}`

### `ordinal_subscriber_delete`

Delete Subscriber · Destructive

Remove a subscriber from a post by subscription id.
Returns deletedSubscriber with its id, user, createdBy and createdAt.
Use ordinal_post_subscribers_list to find the subscription id (not the user id).

Read only: no. Destructive: yes. Idempotent (safe to retry): yes.

Inputs:

- `subscriber_id` (`string`, required): ID of the subscriber record to remove (UUID).

Example input: `{"subscriber_id":"<subscriber_id>"}`

## Related

Other Marketing connectors ([all 87](/agentkit/connectors/?category=marketing)):

- [HubSpot](/agentkit/connectors/hubspot/): Scalekit connector, OAuth, 457 tools
- [Mailchimp](/agentkit/connectors/mailchimp/): Scalekit connector, OAuth, 73 tools
- [Twitter / X](/agentkit/connectors/twitteroauth/): Scalekit connector, OAuth, 92 tools


---

## More Scalekit documentation

| Resource | What it contains | When to use it |
|----------|-----------------|----------------|
| [/llms.txt](/llms.txt) | Structured index with routing hints per product area | Start here — find which documentation set covers your topic before loading full content |
| [/llms-full.txt](/llms-full.txt) | Complete documentation for all Scalekit products in one file | Use when you need exhaustive context across multiple products or when the topic spans several areas |
| [sitemap-0.xml](https://docs.scalekit.com/sitemap-0.xml) | Full URL list of every documentation page | Use to discover specific page URLs you can fetch for targeted, page-level answers |
