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

> Create and schedule Social media studio posts from Make scenarios with the HTTP module, and start scenarios from signed webhooks.

There is **no native Social media studio app on Make** (formerly Integromat) yet. Make's built-in modules cover both directions:

* **Make → Social media studio:** the **HTTP → Make a request** module calls the REST API to create or schedule a post.
* **Social media studio → Make:** the **Webhooks → Custom webhook** trigger receives the events Social media studio sends (post published, post failed, new comment, and more).

> [!NOTE]
>
> 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 scenario

**1. Build the body with a JSON module**

Add **JSON → Create JSON**. Define a data structure with the fields below and map values from earlier modules. Make escapes quotes and line breaks for you, which a hand-typed JSON body does not.

**2. Send it with the HTTP module**

Add **HTTP → Make a request**:

| Setting | Value |
| - | - |
| URL | `https://api.so-me.studio/v1/posts` |
| Method | `POST` |
| Headers | `X-API-Key` → your `sk_live_...` key |
| Body type | Raw |
| Content type | JSON (`application/json`) |
| Request content | The **JSON string** output of Create JSON |
| Parse response | Yes |

| 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. In Make, `{{formatDate(myDate; "YYYY-MM-DDTHH:mm:ssZ")}}` produces 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 | An array of media library file IDs. Upload media in Social media studio first, or see [Quickstart](/quickstart.md#upload-media) for presigned uploads. |
| `threadParts` | No | An array of `{ "text": "..." }` objects that follow the head post (X, Threads, Bluesky, Mastodon). |
| `tiktok` | For TikTok | `{ "privacyLevel": "PUBLIC_TO_EVERYONE" }` at least; TikTok rejects a post without a privacy level. |
| `metaData` | For Pinterest | `{ "boardId": "1234567890123456789" }`, a board `id` from `GET /v1/accounts/{id}/pinterest/boards`. A Pinterest post without a board is rejected with `400`. |

The body the HTTP module sends looks like this:

```json theme={null}
{
  "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"`. To post to several platforms, use one HTTP module per platform, or an **Iterator** over a list of platforms.

> **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. |
>
> Add an error handler route to the HTTP module if a scenario should keep going after a failed post.

## Start a scenario from a Social media studio event

**1. Create the webhook in Make**

Start the scenario with **Webhooks → Custom webhook**, click **Add**, and copy the address Make gives you.

**2. Subscribe that address 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 Make address, 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://hook.eu2.make.com/your-webhook-id",
    "categories": ["post"],
    "events": ["post.published", "post.failed"],
    "description": "Make"
  }'
```

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

**3. Let Make learn the structure**

With the Custom webhook module listening (**Run once**), click **Test** on the subscription in Settings → Webhooks. Make records the fields of the sample delivery.

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" }
}
```

Use a **filter** on `event` when one webhook receives several event types. The `data` block carries IDs rather than full content; for a post, add an HTTP module with `GET https://api.so-me.studio/v1/posts/{{data.postId}}` and the `X-API-Key` header to read its text, live link (`shareUrl`) or `failureReason`.

Useful events 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. The Custom webhook module does not check it, so treat the Make address as a secret. To verify, turn on the webhook's **Get request headers** and **JSON pass-through** options so the scenario receives the header and the unparsed body, then compare an HMAC-SHA256 of that body with the header. Make's `sha256()` function accepts an HMAC key; check Make's function reference for the argument order. 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.
* [Zapier](/integrations/zapier.md) works the same way, with Webhooks by Zapier.


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