> **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 Typefully

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

**Authentication:** Bearer Token
**Categories:** Marketing
**Tools:** 18: 10 read, 7 write, 1 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=TYPEFULLY)

## 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 Typefully connection

   In **AgentKit > Connections**, create a Typefully 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 = 'typefully'
   const identifier = 'user_123'

   // Generate an authorization link for the user
   const { link } = await actions.getAuthorizationLink({ connectionName: connector, identifier })
   console.log('Authorize Typefully:', 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: 'typefully_get_me',
     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 = "typefully"
   identifier = "user_123"

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

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

   ```bash
   python quickstart.py
   ```

   Each user opens the link once and enters their Typefully 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: 'typefully_get_draft',
  toolInput: {
    draft_id: 1,
    social_set_id: 1,
  },
  connector: 'typefully',
  identifier: 'user_123',
})
```

**Python**

```python
result = actions.execute_tool(
    tool_name="typefully_get_draft",
    tool_input={
        "draft_id": 1,
        "social_set_id": 1,
    },
    connection_name="typefully",
    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.

### `typefully_get_draft`

Get Draft · Read-only

Get one draft with its full content.
Returns the draft's status, publish_state, title, tags, scheduled date, share and private URLs, the per-platform posts and any published post URLs.
Use it to read a draft before editing it, or to poll publish_state after publishing with publish_at set to now. Use list_drafts to find draft ids.

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

Inputs:

- `draft_id` (`integer`, required): Numeric ID of the draft. Get it from typefully_list_drafts or from the response of typefully_create_draft.
- `social_set_id` (`integer`, required): Numeric ID of the Typefully social set (connected account profile) to act on. Get it from typefully_list_social_sets.

Example input: `{"draft_id":1,"social_set_id":1}`

### `typefully_get_me`

Get Current User · Read-only

Get the Typefully user that owns the API key.
Returns the user id, name, email, profile image URL, signup date and the label of the API key.
Use it to confirm the credential works. Use list_social_sets to find the accounts this user can post to.

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

Inputs: none.

Example input: `{}`

### `typefully_get_queue`

Get Queue · Read-only

Get the publishing queue of a social set for a date range, with the scheduled drafts and open slots for each day.
Returns start_date, end_date and a days list describing each day's slots and scheduled drafts.
Use it to see what is scheduled and which slots are free. Use list_drafts with status scheduled for a flat list of drafts.

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

Inputs:

- `end_date` (`string`, required): Last day of the range as a date in YYYY-MM-DD format.
- `social_set_id` (`integer`, required): Numeric ID of the Typefully social set (connected account profile) to act on. Get it from typefully_list_social_sets.
- `start_date` (`string`, required): First day of the range as a date in YYYY-MM-DD format.

Example input: `{"end_date":"<end_date>","social_set_id":1,"start_date":"<start_date>"}`

### `typefully_get_queue_schedule`

Get Queue Schedule · Read-only

Get the recurring posting schedule of a social set's queue.
Returns the social set id, its timezone and the list of rules, each with hour, minute and days of the week.
Use it to see when next-free-slot publishing lands. Use update_queue_schedule to change it.

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

Inputs:

- `social_set_id` (`integer`, required): Numeric ID of the Typefully social set (connected account profile) to act on. Get it from typefully_list_social_sets.

Example input: `{"social_set_id":1}`

### `typefully_get_social_set`

Get Social Set · Read-only

Get the details of one social set (connected account profile).
Returns its id, username, name, team, connected platforms and publishing quota.
Use it to see which platforms are connected before creating a draft. Use list_social_sets to find the id.

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

Inputs:

- `social_set_id` (`integer`, required): Numeric ID of the Typefully social set (connected account profile) to act on. Get it from typefully_list_social_sets.

Example input: `{"social_set_id":1}`

### `typefully_list_comment_threads`

List Comment Threads · Read-only

List the comment threads on a draft.
Returns a page of threads with id, platform, status, the selected text each is anchored to and its comments, plus paging fields.
Use it to read review feedback on a draft. Use create_comment_thread to start a new thread.

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

Inputs:

- `draft_id` (`integer`, required): Numeric ID of the draft. Get it from typefully_list_drafts or from the response of typefully_create_draft.
- `social_set_id` (`integer`, required): Numeric ID of the Typefully social set (connected account profile) to act on. Get it from typefully_list_social_sets.
- `limit` (`integer`, optional): Maximum number of items to return per page, from 1 to 50. The API default is 10.
- `offset` (`integer`, optional): Number of items to skip before returning results, for paging through long lists. The API default is 0.
- `platform` (`string`, optional): Only return threads on this platform's posts. Leave empty for all platforms. One of: `x`, `linkedin`, `mastodon`, `threads`, `bluesky`, `substack`, `x_article`.
- `status` (`string`, optional): Which threads to return: unresolved, resolved or all. The API default is unresolved, so resolved threads are left out unless you ask for them. One of: `unresolved`, `resolved`, `all`.

Example input: `{"draft_id":1,"social_set_id":1}`

### `typefully_list_drafts`

List Drafts · Read-only

List drafts in a social set, optionally filtered by status or tag.
Returns a page of drafts with id, status, preview text, scheduled date, tags, private URL and per-platform published timestamps, plus paging fields.
Use it to browse or find drafts. Use get_draft for the full content of one draft.

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

Inputs:

- `social_set_id` (`integer`, required): Numeric ID of the Typefully social set (connected account profile) to act on. Get it from typefully_list_social_sets.
- `limit` (`integer`, optional): Maximum number of items to return per page, from 1 to 50. The API default is 10.
- `offset` (`integer`, optional): Number of items to skip before returning results, for paging through long lists. The API default is 0.
- `order_by` (`string`, optional): Field to sort by. Prefix with a minus sign for descending order. The API default is -updated_at (most recently edited first). One of: `created_at`, `-created_at`, `updated_at`, `-updated_at`, `scheduled_date`, `-scheduled_date`, `published_at`, `-published_at`.
- `status` (`string`, optional): Only return drafts with this status. 'draft' is saved but unscheduled, 'scheduled' will auto-publish at its scheduled date, 'planned' has a date but will not publish until confirmed, 'publishing' is in flight, 'published' was posted and 'error' failed to publish. Leave empty for all statuses. One of: `draft`, `published`, `scheduled`, `planned`, `error`, `publishing`.
- `tag` (`string`, optional): Only return drafts that have this tag. Use the tag slug (not its display name) from typefully_list_tags, for example product-launch.

Example input: `{"social_set_id":1}`

### `typefully_list_social_sets`

List Social Sets · Read-only

List the social sets (connected account profiles) the API key can access.
Returns a page of social sets with id, username, name and connected platforms, plus count and next/previous links.
Use it first to get the social_set_id that every draft, tag and queue tool needs. Use get_social_set for one set's details.

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

Inputs:

- `limit` (`integer`, optional): Maximum number of items to return per page, from 1 to 50. The API default is 10.
- `offset` (`integer`, optional): Number of items to skip before returning results, for paging through long lists. The API default is 0.

Example input: `{}`

### `typefully_list_tags`

List Tags · Read-only

List the tags defined in a social set.
Returns a page of tags with slug, name and creation time, plus paging fields.
Use it to find the slug to filter list_drafts or to put on a draft. Use create_tag to add a new one.

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

Inputs:

- `social_set_id` (`integer`, required): Numeric ID of the Typefully social set (connected account profile) to act on. Get it from typefully_list_social_sets.
- `limit` (`integer`, optional): Maximum number of items to return per page, from 1 to 50. The API default is 10.
- `offset` (`integer`, optional): Number of items to skip before returning results, for paging through long lists. The API default is 0.

Example input: `{"social_set_id":1}`

### `typefully_resolve_linkedin_organization`

Resolve LinkedIn Organization · Read-only

Look up a LinkedIn company page from its URL so you can mention it in a LinkedIn post.
Returns the organization id, URN, mention_text, name, vanity name, description, website, logo URL and URL.
Use it before writing a LinkedIn post that tags a company. Paste the returned mention_text into the post text.

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

Inputs:

- `organization_url` (`string`, required): Full URL of the LinkedIn company page, for example https://www.linkedin.com/company/typefully.
- `social_set_id` (`integer`, required): Numeric ID of the Typefully social set (connected account profile) to act on. Get it from typefully_list_social_sets.

Example input: `{"organization_url":"<organization_url>","social_set_id":1}`

### `typefully_add_comment_to_thread`

Add Comment to Thread · Write

Reply on an existing comment thread of a draft.
Returns the full thread with its id, platform, status, selected text and all comments including the new one.
Use it to answer review feedback. Use create_comment_thread to start a thread on new text.
Needs comment_thread_id from list_comment_threads.

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

Inputs:

- `comment_thread_id` (`string`, required): UUID of the comment thread on the draft. Get it from typefully_list_comment_threads.
- `draft_id` (`integer`, required): Numeric ID of the draft. Get it from typefully_list_drafts or from the response of typefully_create_draft.
- `social_set_id` (`integer`, required): Numeric ID of the Typefully social set (connected account profile) to act on. Get it from typefully_list_social_sets.
- `text` (`string`, required): Plain-text body of the reply, up to 10000 characters.

Example input: `{"comment_thread_id":"<comment_thread_id>","draft_id":1,"social_set_id":1,"text":"<text>"}`

### `typefully_create_comment_thread`

Create Comment Thread · Write

Start a comment thread anchored to a piece of text in a draft post.
Returns the new thread with its id, platform, status, selected text and comments.
Use it to leave review feedback on specific wording. Use add_comment_to_thread to reply on an existing thread.
The selected text must match the post text exactly; read it with get_draft first.

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

Inputs:

- `draft_id` (`integer`, required): Numeric ID of the draft. Get it from typefully_list_drafts or from the response of typefully_create_draft.
- `post_index` (`integer`, required): Zero-based position of the target post within the platform's posts array, so 0 is the first post of a thread.
- `selected_text` (`string`, required): Exact piece of the post text the thread is anchored to. Copy it verbatim from the draft's post text, including punctuation.
- `social_set_id` (`integer`, required): Numeric ID of the Typefully social set (connected account profile) to act on. Get it from typefully_list_social_sets.
- `text` (`string`, required): Plain-text body of the first comment, up to 10000 characters.
- `occurrence` (`integer`, optional): Zero-based occurrence of the selected text when the same text appears more than once in the post. The API default is 0, the first occurrence.
- `platform` (`string`, optional): Platform whose post you are commenting on. Required when the draft has more than one commentable platform; otherwise it is detected automatically. One of: `x`, `linkedin`, `mastodon`, `threads`, `bluesky`, `substack`.

Example input: `{"draft_id":1,"post_index":1,"selected_text":"<selected_text>","social_set_id":1,"text":"<text>"}`

### `typefully_create_draft`

Create Draft · Write

Create a draft, scheduled post or immediate post in a social set.
Returns the new draft with its id, status, publish_state, private URL, platform posts and scheduling fields.
Use it to write posts for one or more platforms. Set publish_at to schedule or publish, or leave it empty to save a draft. Use update_draft to change an existing draft.
Needs social_set_id from list_social_sets; any tags must already exist (see list_tags).

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

Inputs:

- `platforms` (`object`, required): Platform settings keyed by platform name: x, linkedin, mastodon, threads, bluesky or substack. Each platform you want to post to takes enabled set to true and a posts array, where every post has a text and may carry media_ids. Each array entry is one post, so several entries make a thread. Platform extras are optional: x posts accept reply_settings and quote_post_url, and x settings accept reply_to_url or community_id; linkedin settings accept first_comment. A platform set to enabled false needs no posts. Example: {"x": {"enabled": true, "posts": [{"text": "Launching today"}, {"text": "Details in the thread"}]}, "linkedin": {"enabled": true, "posts": [{"text": "Launching today"}]}}.
- `social_set_id` (`integer`, required): Numeric ID of the Typefully social set (connected account profile) to act on. Get it from typefully_list_social_sets.
- `draft_title` (`string`, optional): Internal title for organising drafts in Typefully. It is never posted to social media. Up to 512 characters.
- `plan_at` (`string`, optional): Date to plan the draft for: next-free-slot or a future ISO 8601 datetime with a timezone offset. A planned draft appears on the queue and calendar but never publishes until you confirm it by setting publish_at. Cannot be combined with publish_at.
- `publish_at` (`string`, optional): When to publish: the word now to publish immediately, next-free-slot for the next queue slot, or a future ISO 8601 datetime with a timezone offset. Leave empty to keep the item a plain draft. Cannot be combined with plan_at. Publishing with now is asynchronous: the response shows publish_state in_progress, so poll typefully_get_draft until it is finished.
- `scratchpad_text` (`string`, optional): Plain-text notes attached to the draft for your own reference. Formatting is stripped and the text is never posted.
- `share` (`boolean`, optional): Set true to generate a public share URL that lets anyone with the link view the draft. The API default is false.
- `tags` (`array`, optional): Tag slugs (not display names) to put on the draft, up to 10. Each tag must already exist in the social set; create missing ones with typefully_create_tag.

Example input: `{"platforms":{},"social_set_id":1}`

### `typefully_create_tag`

Create Tag · Write

Create a tag in a social set.
Returns the new tag's slug, name and creation time. The slug is generated from the name.
Use it before putting a new tag on a draft. Use list_tags to check what already exists.

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

Inputs:

- `name` (`string`, required): Display name for the new tag, 1 to 32 characters. The slug is generated from it, for example Product Launch becomes product-launch.
- `social_set_id` (`integer`, required): Numeric ID of the Typefully social set (connected account profile) to act on. Get it from typefully_list_social_sets.

Example input: `{"name":"<name>","social_set_id":1}`

### `typefully_resolve_comment_thread`

Resolve Comment Thread · Write

Mark a comment thread on a draft as resolved.
Returns the thread with its id, platform, status, selected text and comments.
Use it once feedback has been handled. Use list_comment_threads with status unresolved to find unresolved threads.

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

Inputs:

- `comment_thread_id` (`string`, required): UUID of the comment thread on the draft. Get it from typefully_list_comment_threads.
- `draft_id` (`integer`, required): Numeric ID of the draft. Get it from typefully_list_drafts or from the response of typefully_create_draft.
- `social_set_id` (`integer`, required): Numeric ID of the Typefully social set (connected account profile) to act on. Get it from typefully_list_social_sets.

Example input: `{"comment_thread_id":"<comment_thread_id>","draft_id":1,"social_set_id":1}`

### `typefully_update_draft`

Update Draft · Write

Edit an existing draft, including its posts, tags, title and schedule.
Returns the updated draft with its status, publish_state, platform posts and scheduling fields.
Use it to change content, schedule, confirm a planned draft or publish now. Only the fields you send change. Use create_draft for a new draft.
Needs draft_id from list_drafts or get_draft.

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

Inputs:

- `draft_id` (`integer`, required): Numeric ID of the draft. Get it from typefully_list_drafts or from the response of typefully_create_draft.
- `social_set_id` (`integer`, required): Numeric ID of the Typefully social set (connected account profile) to act on. Get it from typefully_list_social_sets.
- `draft_title` (`string`, optional): Internal title for organising drafts in Typefully. It is never posted to social media. Up to 512 characters.
- `force_overwrite_comments` (`boolean`, optional): Set true to accept new post text that drops the comment anchors of existing comment threads; those threads are then resolved automatically. The API default is false, which rejects such edits with a 409 error.
- `plan_at` (`string`, optional): Date to plan the draft for: next-free-slot or a future ISO 8601 datetime with a timezone offset. A planned draft appears on the queue and calendar but never publishes until you confirm it by setting publish_at. Cannot be combined with publish_at.
- `platforms` (`object`, optional): Platform settings to change, keyed by platform name: x, linkedin, mastodon, threads, bluesky or substack. Only the platforms you include are updated; the rest stay as they are. For an included platform, send enabled and the complete posts array, because the posts you send replace that platform's posts. Example: {"x": {"enabled": true, "posts": [{"text": "Updated text"}]}}.
- `publish_at` (`string`, optional): When to publish: the word now to publish immediately, next-free-slot for the next queue slot, or a future ISO 8601 datetime with a timezone offset. Leave empty to keep the item a plain draft. Cannot be combined with plan_at. Publishing with now is asynchronous: the response shows publish_state in_progress, so poll typefully_get_draft until it is finished.
- `scratchpad_text` (`string`, optional): Plain-text notes attached to the draft for your own reference. Formatting is stripped and the text is never posted.
- `share` (`boolean`, optional): Set true to generate a public share URL that lets anyone with the link view the draft. The API default is false.
- `tags` (`array`, optional): Tag slugs (not display names) to put on the draft, up to 10. Each tag must already exist in the social set; create missing ones with typefully_create_tag. Sending a list replaces the draft's existing tags.

Example input: `{"draft_id":1,"social_set_id":1}`

### `typefully_update_queue_schedule`

Update Queue Schedule · Write

Replace the whole recurring posting schedule of a social set's queue.
Returns the social set id, its timezone and the saved rules.
Use it to change posting times. The rules you send replace every existing rule, so fetch them with get_queue_schedule first and send the full list back with your changes.

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

Inputs:

- `rules` (`array`, required): Complete list of schedule rules that replaces the current ones. Each rule has h (hour, 0 to 23), m (minute, 0 to 59) and days, a list of at least one of mon, tue, wed, thu, fri, sat, sun. Times are in the social set's timezone. Example: [{"h": 9, "m": 30, "days": ["mon", "wed", "fri"]}].
- `social_set_id` (`integer`, required): Numeric ID of the Typefully social set (connected account profile) to act on. Get it from typefully_list_social_sets.

Example input: `{"rules":[],"social_set_id":1}`

### `typefully_delete_draft`

Delete Draft · Destructive

Delete a draft permanently.
Returns an empty success response when the draft is deleted.
Use it only when the draft is no longer wanted. Use update_draft to unschedule or edit instead.
Needs draft_id from list_drafts.

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

Inputs:

- `draft_id` (`integer`, required): Numeric ID of the draft. Get it from typefully_list_drafts or from the response of typefully_create_draft.
- `social_set_id` (`integer`, required): Numeric ID of the Typefully social set (connected account profile) to act on. Get it from typefully_list_social_sets.

Example input: `{"draft_id":1,"social_set_id":1}`

## 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 |
