> ## Documentation Index
> Fetch the complete documentation index at: https://docs.so-me.studio/llms.txt
> Use this file to discover all available pages before exploring further.

# Automate Social Media Posting with Zapier

> Create and schedule Social media studio posts from any Zap with the REST API, and start Zaps from signed webhooks when posts publish or fail.

There is **no native Social media studio app on Zapier** yet. You can still connect the two with Zapier's built-in **Webhooks by Zapier** app:

* **Zapier → Social media studio:** a Webhooks by Zapier action calls the REST API to create or schedule a post.
* **Social media studio → Zapier:** a Webhooks by Zapier trigger catches the events Social media studio sends (post published, post failed, new comment, and more).

> [!NOTE]
>
> Webhooks by Zapier may require a paid Zapier plan. Check your Zapier plan before you build. On the Social media studio side, the REST API needs a **Standard**, **Advanced** or **Lifetime** plan (Lite does not include it). The number of webhook endpoints you can create depends on your plan; see [Webhooks overview](/webhooks/overview.md).

## Before you start

**1. Create an API key**

In Social media studio, open **Settings → API** ([app.so-me.studio/settings?tab=api](https://app.so-me.studio/settings?tab=api)) and create a key. It starts with `sk_live_` and is shown once. See [Authentication](/authentication.md).

**2. Find your account IDs (optional)**

If you connected more than one account on the same platform, every post must say which one to use. List your accounts once and note the `id` of each:

```bash theme={null}
curl https://api.so-me.studio/v1/accounts \
  -H "X-API-Key: sk_live_xxxxxxxxxxxxxxxxxxxxxxxx"
```

With exactly one account on a platform, you can leave `accountId` out.

## Create or schedule a post from a Zap

Add an action step: **Webhooks by Zapier → POST**.

| Field | Value |
| - | - |
| URL | `https://api.so-me.studio/v1/posts` |
| Payload Type | `json` |
| Data | One row per body field (table below), mapped from earlier steps |
| Headers | `X-API-Key` → your `sk_live_...` key |

Zapier builds and escapes the JSON for you, so text with quotes or line breaks is safe.

| Body field | Required | Value |
| - | - | - |
| `text` | Yes | The post text. |
| `socialMedia` | Yes | One platform per request: `TWITTER`, `LINKEDIN`, `LINKEDIN_PAGE`, `FACEBOOK`, `INSTAGRAM`, `THREADS`, `TIKTOK`, `YOUTUBE`, `PINTEREST`, `BLUESKY`, `MASTODON`, `REDDIT`, `GOOGLE_MY_BUSINESS`, `WORDPRESS`, `DEV_TO`, `DRIBBBLE`, `DISCORD` or `SLACK`. `WHATSAPP` and `TELEGRAM` cannot be posted to. |
| `postType` | Yes | `TEXT`, `IMAGE`, `MULTIPLE_IMAGES`, `VIDEO`, `CAROUSEL`, `REEL` or `STORY`. |
| `scheduledAt` | No | ISO 8601 time, for example `2026-11-02T09:00:00Z`. Leave it out to publish right away. Zapier's **Formatter → Date / Time → Format** step can convert a date to this format. |
| `accountId` | When needed | The account `id` from `GET /v1/accounts`. Needed when more than one account is connected on that platform; otherwise the API answers `400` with the list to choose from. |
| `firstComment` | No | A comment posted under the post right after it publishes (Facebook, Instagram, X, LinkedIn, LinkedIn Page, Threads, YouTube). |
| `fileIds` | No | Media library file IDs to attach, as a list. Upload media in Social media studio first, or see [Quickstart](/quickstart.md#upload-media) for presigned uploads. |

To post to several platforms, add one POST step per platform.

The equivalent request, for testing outside Zapier:

```bash theme={null}
curl -X POST https://api.so-me.studio/v1/posts \
  -H "X-API-Key: sk_live_xxxxxxxxxxxxxxxxxxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{
    "text": "New on the blog: how we plan a month of posts in an afternoon",
    "socialMedia": "LINKEDIN",
    "postType": "TEXT",
    "scheduledAt": "2026-11-02T09:00:00Z"
  }'
```

A successful call returns `201` with the post, including its `id` and `postStatus: "SCHEDULED"`. Map the `id` into later steps if you want to update or delete the post.

> **Nested fields: TikTok options and threads**
>
> TikTok posts need `tiktok.privacyLevel`, and threads use a `threadParts` array. The POST action sends flat key-value data, so use **Webhooks by Zapier → Custom Request** for these, with Method `POST`, the same URL and headers plus `Content-Type: application/json`, and the JSON body typed in **Data**:
>
> ```json theme={null}
> {
>   "text": "First post of the thread",
>   "socialMedia": "TWITTER",
>   "postType": "TEXT",
>   "threadParts": [{ "text": "Second post" }, { "text": "Third post" }]
> }
> ```
>
> Custom Request sends the body as typed and does not escape mapped values. A mapped field that contains a double quote or a line break produces invalid JSON, which the API rejects with `400`.

> **Errors**
>
> | Status | Meaning |
> | - | - |
> | `400` | A field is invalid, or `accountId` is missing while several accounts are connected on that platform. The message names the problem. |
> | `401` | The API key is missing, wrong or revoked. |
> | `403` | Your plan does not include the REST API, or a plan limit was reached. |
> | `429` | Rate limit reached. The limit is per workspace and depends on your plan. |

## Start a Zap from a Social media studio event

**1. Create the trigger in Zapier**

Choose **Webhooks by Zapier → Catch Hook** as the trigger and copy the webhook URL Zapier gives you.

**2. Subscribe that URL in Social media studio**

Open **Settings → Webhooks** ([app.so-me.studio/settings?tab=webhooks](https://app.so-me.studio/settings?tab=webhooks)), add an endpoint with the Zapier URL, and pick the events. Or create it with the API:

```bash theme={null}
curl -X POST https://api.so-me.studio/v1/webhooks/subscriptions \
  -H "X-API-Key: sk_live_xxxxxxxxxxxxxxxxxxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://hooks.zapier.com/hooks/catch/123456/abcdef/",
    "categories": ["post"],
    "events": ["post.published", "post.failed"],
    "description": "Zapier"
  }'
```

The response includes the subscription's signing `secret`.

**3. Send a test event**

Click **Test** on the subscription in Settings → Webhooks, then **Test trigger** in Zapier so it learns the fields.

Every delivery is a JSON `POST` with this envelope:

```json theme={null}
{
  "event": "post.published",
  "category": "post",
  "timestamp": "2026-11-02T09:00:04.000Z",
  "data": { "postId": "6f1c2a9e-...", "platform": "LINKEDIN" }
}
```

In Zapier the fields appear as `Event`, `Data Post Id`, `Data Platform` and so on. The `data` block carries IDs rather than full content; for a post, call `GET https://api.so-me.studio/v1/posts/{postId}` with a **Webhooks by Zapier → GET** step to read its text, live link (`shareUrl`) or `failureReason`.

Useful events for Zaps include `post.published`, `post.failed`, `post.scheduled`, `inbox.message_received`, `inbox.comment_received`, `social.account_disconnected` and `quota.limit_reached`. See [Webhooks overview](/webhooks/overview.md) for the full list and [Payload format](/webhooks/payloads.md) for example payloads.

> [!WARNING]
>
> Each delivery carries an `X-Webhook-Signature` header: a hex HMAC-SHA256 of the raw body, keyed with the subscription secret. Catch Hook does not check it, so treat the Zapier URL as a secret. To verify, use **Catch Raw Hook** (which passes the unparsed body and headers on) and a **Code by Zapier** step that computes the HMAC of the raw body and compares it with the header. Details: [Signature verification](/webhooks/payloads.md#signature-verification).

Social media studio waits 10 seconds for an answer and retries a failed delivery up to 4 times. A subscription that fails 10 times in a row is disabled; re-enable it in Settings → Webhooks.

## Other tools

* [n8n](/integrations/n8n.md) has a community node and ready-made workflow templates.
* [Make](/integrations/make.md) works the same way as Zapier, with its HTTP and Webhooks modules.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.