# Schedule & Chill — Help Center and Developer Docs (full text) Source: https://schedulenchill.com/help # Welcome to Schedule & Chill Schedule & Chill lets you write a social post once, send it to all your channels, and publish it now or at the time you choose. You can also let an AI tool like Claude or ChatGPT write and schedule posts for you. You can publish to **LinkedIn, Bluesky, Mastodon and YouTube** today. ## Set up in three steps 1. **[Connect a channel](/help/channels/connect)** — link the social account you want to post to. 2. **[Set your time zone](/help/account/profile-timezone)** — new accounts start in UTC. Set your own zone so scheduled times mean what you expect. 3. **[Publish your first post](/help/getting-started/first-post)** — it takes about two minutes. ## Find what you need | I want to… | Read | |---|---| | Write, schedule or save a post | [Write and publish a post](/help/posts/write-a-post) | | Publish at a set time, or on a weekly schedule | [Choose when a post goes out](/help/posts/when-to-publish) | | Know the text and media limits of each platform | [What each platform accepts](/help/posts/platform-rules) | | Fix a post that failed | [When a post fails](/help/manage/failed-posts) | | Fix a channel that says Reconnect | [Reconnect or disconnect a channel](/help/channels/fix-or-disconnect) | | Post from Claude, ChatGPT or Cursor | [Connect your AI tool](/help/ai-tools/connect-ai-tool) | | See how posts perform | [Understand your analytics](/help/analytics) | | Know what my plan includes | [Your plan and limits](/help/account/plan-limits) | ## Ask an AI about any page Every help page has a **Copy as Markdown** button at the top. Paste the page into ChatGPT or Claude and ask your question. AI assistants can also read the whole Help Center at [schedulenchill.com/llms-full.txt](/llms-full.txt). ## Still stuck? See [Contact support](/help/troubleshooting/contact). --- Source: https://schedulenchill.com/help/getting-started/create-account # Create your account and sign in Schedule & Chill is **free**. There is no paid plan, no credit card and no trial clock. ## Sign up with Google or LinkedIn 1. Go to the **Create your account** page. 2. Click **Google** or **LinkedIn** and approve. Your email is confirmed automatically, and you land on your **Dashboard**. If you already have an account with the same email, you are signed in to that account instead. ## Sign up with email 1. Go to the **Create your account** page. 2. Fill in **Your name**, **Work email**, **Password** and **Confirm password**. Your password needs at least 8 characters. 3. Complete the security check under the password fields, if it shows. 4. Click **Create free account** (or **Create account**). 5. Open the email we send you and click the link. It usually arrives within a minute. Check your spam folder if it doesn't. After you confirm, you start the short setup: [Publish your first post](/help/getting-started/first-post). Didn't get the email? On the **Confirm your email** page, click **Resend confirmation email**. Typed the wrong address? Click **Sign out and start over**. ## Sign in 1. Go to the **Welcome back** page. 2. Click **Google** or **LinkedIn**, or enter your **Email** and **Password** and click **Sign in**. 3. Tick **Keep me signed in** to stay signed in on this device. If you turned on two-factor authentication, enter the 6-digit code from your authenticator app. See [Password and two-factor authentication](/help/account/password-2fa). ## Forgot your password 1. On the sign-in page, click **Forgot password?** 2. Enter the email you signed up with and click **Send reset link**. 3. Open the email and click the link. It works for 60 minutes. 4. Enter a **New password**, confirm it, and click **Save new password**. This also works if you signed up with Google or LinkedIn and want to add a password. ## If something goes wrong | You see | What to do | |---|---| | **The security check could not load. …** | An ad blocker or a strict network blocks the check. Allow `challenges.cloudflare.com` and reload, or email support@schedulenchill.com. | | **That security check did not pass. Reload the page and try again.** | Reload the page and sign up again. | | **Too many accounts have been created from this network. Try again later, …** | Wait and try again later, or email support@schedulenchill.com. | | **This account has been suspended. Contact support@schedulenchill.com.** | Email support@schedulenchill.com. | --- Source: https://schedulenchill.com/help/getting-started/first-post # Publish your first post When you sign up with email, Schedule & Chill opens a short setup called **Get started**. It has four steps. You can skip any of them and finish later from the **Finish setting up** bar on your Dashboard. ## Step 1 — Tell us about you Answer two optional questions: **Which sounds most like you?** and **How do you want to post?** Click **Continue**, or **Skip these**. ## Step 2 — Connect your account 1. Click **Connect LinkedIn**. 2. LinkedIn opens and asks you to allow Schedule & Chill to post for you. Allow it. 3. You come back to the setup. We never read your feed, your messages or your connections. Nothing is published until you write it and press publish yourself. Want a different platform first? Click **I'll connect later**, then follow [Connect a social channel](/help/channels/connect). ## Step 3 — Create your first post 1. The text box already has a short starter post. Change it however you like. 2. Optional: click **Add photos, a video or a PDF**. 3. Click **Publish now**. It usually takes a few seconds. Stay on the page while it says **Publishing to LinkedIn…**. Prefer to post later? Click **Schedule it for later instead**. This opens the full composer, where you can pick a date and time. First set your time zone — see [Profile and time zone](/help/account/profile-timezone). You can also switch to **Use my AI tool** to create the post from Claude, ChatGPT or another AI tool. See [Connect your AI tool](/help/ai-tools/connect-ai-tool). ## Step 4 — You're live You see **That's live on LinkedIn** and a **View your post on LinkedIn** link. Click **Go to my dashboard** to finish. ## If the post doesn't go out You see **That post didn't go out**. Your text is safe and nothing was posted. The red box shows what LinkedIn said. - Click **Try again**, or - Click **Check my connection** and reconnect LinkedIn. For more causes, see [When a post fails](/help/manage/failed-posts). ## What next - [Write and publish a post](/help/posts/write-a-post) - [Choose when a post goes out](/help/posts/when-to-publish) - [Connect your AI tool](/help/ai-tools/connect-ai-tool) --- Source: https://schedulenchill.com/help/channels/connect # Connect a social channel A **channel** is one social account that Schedule & Chill posts to — for example your LinkedIn profile or your YouTube channel. You need at least one channel before you can publish anything. ## Which platforms you can connect You can connect **LinkedIn, Bluesky, Mastodon and YouTube** today. Other platforms are built but still waiting for approval from the platform itself. See [Platforms that are not available yet](/help/channels/not-available-yet). ## How many channels you can connect You can connect up to **2 channels**. Disconnected channels do not count toward your limit. ## Connect a channel 1. In the left menu, click **Connected Accounts**. The page opens as **Connected channels**. 2. Scroll down to **Add a channel**. 3. Find your platform and click **Connect**. If you already have a channel on that platform, the button says **Add another**. 4. Finish the steps for your platform: - [LinkedIn](/help/channels/linkedin) — sign in to LinkedIn and allow access. - [YouTube](/help/channels/youtube) — pick your Google account and allow access. - [Bluesky](/help/channels/bluesky) — enter your handle and an app password. - [Mastodon](/help/channels/mastodon) — enter your server, then approve on your server. 5. When it works, you see **"… account connected successfully"** and you land on your **Dashboard**. If you are still in first-time setup, you go back to the setup steps instead. ## Check that the channel is ready Open **Connected Accounts** again. Every channel under **Your channels** shows: - a green **Active** badge when it can publish, or a red **Reconnect** badge when it cannot - its **ID**, with a copy button — you only need this for the API or an AI tool - when it last published, or **No posts yet** The badge at the top, for example **1 of 2**, shows how many channels you use out of your limit. ## Add a second account on the same platform Schedule & Chill connects whichever account you are signed into on the platform. To add a second one: 1. Open the platform in the same browser and switch to the other account, or sign out. 2. Come back to **Connected Accounts** and click **Add another**. If you skip step 1, the platform simply reconnects the account you already added. ## If something goes wrong | You see | What to do | |---|---| | **You've reached your plan's limit of … connected accounts. Upgrade to connect more.** | Disconnect a channel you no longer use, then try again. See [Reconnect or disconnect a channel](/help/channels/fix-or-disconnect). | | The **Connect** button is grey | You are at your limit. Hover over it to see **Disconnect a channel to free up a slot**. | | **Invalid state parameter. Please try connecting again.** | The sign-in was interrupted, or opened in two tabs. Start again from **Connected Accounts**. | | **Session expired. Please try connecting again.** | You waited too long on the platform's screen. Start again. | | **Failed to connect account: …** | The platform refused the connection. The text after the colon is its reason. Try again and allow every permission it asks for. | | **That channel is not available yet.** | The platform is still in review. See [Platforms that are not available yet](/help/channels/not-available-yet). | --- Source: https://schedulenchill.com/help/channels/linkedin # Connect LinkedIn Schedule & Chill posts to your **personal LinkedIn profile**. Posting to a LinkedIn company page is not available yet — see [Platforms that are not available yet](/help/channels/not-available-yet). ## Connect your profile 1. Make sure you are signed in to the right LinkedIn account in this browser. 2. In the left menu, click **Connected Accounts**. 3. Under **Add a channel**, find **LinkedIn** and click **Connect**. 4. LinkedIn opens. Click **Allow**. 5. You come back and see **LinkedIn account connected successfully**. To add a second LinkedIn profile, first switch to that account on LinkedIn, then click **Add another**. ## Reconnect about every 60 days LinkedIn gives apps access for about **60 days**, and it does not let us renew it for you. When the access runs out: - the channel shows a red **Reconnect** badge - you get a notification, and an email if posts are scheduled to it - scheduled LinkedIn posts fail until you reconnect Reconnecting takes a few seconds and keeps your history. See [Reconnect or disconnect a channel](/help/channels/fix-or-disconnect). ## What a LinkedIn post can include - Up to **3,000 characters** - Up to **9 images**, or **1 video**, or **1 PDF** — not a mix - A PDF becomes a swipeable document post. It can be up to 300 pages and 100 MB. - A **first comment**, posted right after the post ## LinkedIn settings in the composer Select your LinkedIn channel in **Create Post** to see these settings: | Setting | What it does | Default | |---|---|---| | **Who can see this post** | **Anyone (public)** or **Connections only** | Anyone (public) | | **Show a link preview card** | Builds a preview card from the first link in your caption. LinkedIn does not make one for posts sent by apps, so we make it for you. | On | | **Link card title** | The card's title, up to 200 characters | The page's own title | | **Link card description** | The card's text, up to 300 characters | The page's own description | If you add an image or video, it shows instead of the link card. ## Analytics LinkedIn does not share post numbers (likes, comments, views) for personal profiles with apps. Your LinkedIn posts appear in [Analytics](/help/analytics) without numbers. This is a LinkedIn rule and will not fill in later. ## If something goes wrong | You see | What to do | |---|---| | **Failed to connect account: LinkedIn OAuth error: …** | Try again and click **Allow** on LinkedIn's screen. | | **This LinkedIn account is missing its member id. Reconnect it.** | Reconnect the channel. | | **LinkedIn video did not finish processing within the allowed time** | LinkedIn was slow. Retry the post, or use a shorter video. | | **LinkedIn document error: file exceeds LinkedIn's 100MB limit for document posts.** | Make the PDF smaller than 100 MB. | | The wrong LinkedIn account was connected | Disconnect it, switch accounts on LinkedIn, then connect again. | --- Source: https://schedulenchill.com/help/channels/youtube # Connect YouTube ## What you need - A Google account that **has a YouTube channel**. If the account has no channel yet, create one on YouTube first. - A video for every post. YouTube posts cannot be text only or images only. ## Connect your channel 1. In the left menu, click **Connected Accounts**. 2. Under **Add a channel**, find **YouTube** and click **Connect**. 3. Google opens. Choose the account for the channel you want to post to. 4. Google lists what Schedule & Chill asks for: uploading videos and viewing your YouTube account. Allow it. 5. You come back and see **YouTube account connected successfully**. YouTube connections renew by themselves. You do not need to reconnect unless you remove access in your Google account. ## Post a video to YouTube 1. Click **Create Post** and select your YouTube channel. 2. Add **one video**. Images are not supported on YouTube. 3. Write your caption. By default the **first line** becomes the video title and the **rest** becomes the description. 4. Open the **YouTube settings** to change anything below, then publish or schedule. | Setting | What it does | Default | |---|---|---| | **Video title** | The title on YouTube, up to 100 characters | The first line of your caption | | **Description** | The text under the video, up to 5,000 characters | Your caption after the first line | | **Privacy** | **Public**, **Unlisted** or **Private** | Public | | **Category** | The YouTube category, for example Education or Gaming | People & Blogs | | **Is this made for kids?** | Required by YouTube. You are responsible for choosing correctly. | No, it's not made for kids | Good to know: - The characters `<` and `>` are removed from the title and description, because YouTube does not accept them. - There is no separate Shorts setting. YouTube decides on its side how to show your video. - You can publish up to **10 YouTube videos per day**. ## Analytics YouTube reports views, impressions, reach, likes and comments, so you get the full [Analytics](/help/analytics) page for it. ## If something goes wrong | You see | What to do | |---|---| | **Failed to connect account: No YouTube channel found for this account** | The Google account you picked has no channel. Create a channel on YouTube, or connect again with the right account. | | **YouTube requires a video file to publish.** | Add a video to the post. | | **Daily youtube publishing limit reached …** | You hit the daily limit. The post waits in **Needs attention** — retry it the next day. | | A red **Reconnect** badge on the channel | Access was removed in your Google account. See [Reconnect or disconnect a channel](/help/channels/fix-or-disconnect). | --- Source: https://schedulenchill.com/help/channels/bluesky # Connect Bluesky Bluesky does not use a sign-in window. Instead you give Schedule & Chill your **handle** and an **app password**. An app password is a separate password you create in Bluesky just for one app. We never see your real password. ## Step 1 — create an app password in Bluesky 1. Open Bluesky and go to **Settings → App Passwords** (or open [bsky.app/settings/app-passwords](https://bsky.app/settings/app-passwords)). 2. Add a new app password. Give it a name, for example "Schedule & Chill". 3. Copy the password. It looks like `xxxx-xxxx-xxxx-xxxx`. ## Step 2 — connect in Schedule & Chill 1. In the left menu, click **Connected Accounts**. 2. Under **Add a channel**, find **Bluesky** and click **Connect**. 3. In **Your handle**, type your handle, for example `you.bsky.social`. The `@` is optional. 4. In **App password**, paste the app password from step 1. 5. Click **Connect Bluesky**. You see **Bluesky account connected successfully**. Accounts on the main Bluesky service work. Accounts on a self-hosted Bluesky server are not supported yet. ## What a Bluesky post can include - Up to **300 characters**. An emoji counts as one character. - Up to **4 images**. Large images are compressed automatically to fit Bluesky's 1 MB per image limit. - **No video** and **no first comment**. - Links in your text become clickable. Bluesky reports likes, replies and reposts in [Analytics](/help/analytics). It does not report views. ## Disconnect Bluesky Delete the app password in Bluesky under **Settings → App Passwords**. The connection stops working right away. To remove the channel from Schedule & Chill too, see [Reconnect or disconnect a channel](/help/channels/fix-or-disconnect). ## If something goes wrong | You see | What to do | |---|---| | **Bluesky rejected that handle or app password. Check you used an app password from Settings → App Passwords, not your account password.** | You probably pasted your normal password. Create an app password and try again. Also check the handle spelling. | | **Bluesky sign-in failed: …** | Bluesky had a problem. Wait a minute and try again. | | **Video isn't supported.** in the composer | Remove the video, or post it to a different channel. | --- Source: https://schedulenchill.com/help/channels/mastodon # Connect Mastodon Mastodon has many servers. You tell Schedule & Chill which server your account lives on, then approve the connection on that server. ## Find your server Your server is the part **after the second @** in your handle. If you are `@you@fosstodon.org`, your server is `fosstodon.org`. ## Connect your account 1. In the left menu, click **Connected Accounts**. 2. Under **Add a channel**, find **Mastodon** and click **Connect**. 3. In **Your server**, type the server domain only, for example `mastodon.social`. Do not add `https://` or a port. 4. Click **Continue**. 5. Your own server opens. Sign in if needed and approve the connection. 6. You come back and see **Mastodon account connected successfully**. Self-hosted servers work too. Mastodon connections do not expire. They only stop working if you remove Schedule & Chill from your server's settings. ## What a Mastodon post can include - Your server decides the text limit. Many servers allow 500 characters and some allow more. We read your server's real limit when you connect. - Each link counts as a fixed number of characters, set by your server (usually 23). - Up to **4 images**, or **1 video**. Not both in the same post. - A **first comment** is supported. It is posted as a reply to your post. Mastodon reports likes, replies and boosts in [Analytics](/help/analytics). It does not report views. ## If something goes wrong | You see | What to do | |---|---| | **That does not look like a server address. Enter your instance domain, for example mastodon.social** | Type only the domain, like `mastodon.social`. | | **Only https servers are supported.** | Your server must use https. | | **Enter the domain only, without a port.** | Remove the `:1234` part. | | **Could not find a server at …** | Check the spelling of the domain. | | **… did not respond like a Mastodon server. Check the domain and try again.** | The address is not a Mastodon server, or the server is down. | | **Failed to connect account: Could not read your Mastodon profile.** | Try again. If it keeps failing, your server may block new apps. | | **Mastodon took too long to process the attachment.** | Your server was slow with the image or video. Retry the post. | --- Source: https://schedulenchill.com/help/channels/not-available-yet # Platforms that are not available yet You can connect **LinkedIn, Bluesky, Mastodon and YouTube** today. Every other platform needs to approve Schedule & Chill before we can post for you. Until that approval arrives, the platform shows on **Connected Accounts** under **In platform review**, with the reason and no **Connect** button. ## Why each platform is waiting - **X** — X charges per post — not available on the free plan yet - **LinkedIn Page** — Awaiting LinkedIn Community Management API access - **Facebook Page** — Awaiting Meta Tech Provider verification - **Instagram** — Awaiting Meta Tech Provider verification - **Pinterest** — Awaiting Pinterest standard access - **TikTok** — TikTok content posting audit in progress These are the platforms' own review queues, so there are no dates. ## What happens when a platform opens It turns on for everybody at the same moment. There is nothing to upgrade and nothing to migrate: a **Connect** button simply appears under **Add a channel**. ## Why we don't let you connect them early A platform that has not approved an app often accepts the post and then hides it from everyone except you. The post looks published but nobody sees it. We show the platform as unavailable instead, so a post never fails silently. --- Source: https://schedulenchill.com/help/channels/fix-or-disconnect # Reconnect or disconnect a channel ## Why a channel stops working A channel needs a valid permission from the platform to publish. It stops working when: - you removed Schedule & Chill's access on the platform, or changed your password there - the platform's permission expired and could not renew itself - you deleted the Bluesky app password or removed the app from your Mastodon server When this happens: - the channel shows a red **Reconnect** badge on **Connected Accounts** - the page shows an **Action needed** banner - the **Dashboard** shows a **Fix** button - you get a notification. If posts are scheduled to that channel, you also get an email: **Reconnect … — … scheduled posts will fail** Posts scheduled to a broken channel fail until you reconnect it. ## Reconnect a channel 1. In the left menu, click **Connected Accounts**. 2. On the broken channel, click **Reconnect to keep posting**. You can also open the **⋮** menu and click **Reconnect**. 3. Sign in on the platform with **the same account** as before and allow access. - Bluesky: create a new app password and enter it. - Mastodon: enter your server again. 4. The channel turns green again. It keeps the same ID, post history and analytics. Use the button on **Connected Accounts** to reconnect. It works even when you are at your channel limit. If you sign in with a **different** account, Schedule & Chill adds it as a new channel and the broken one stays broken. ## Refresh a channel's name and photo If you changed your name or profile photo on the platform: 1. Open **Connected Accounts**. 2. On the channel, open the **⋮** menu and click **Refresh profile**. You see **Channel profile refreshed.** If the platform does not answer, you see **Could not read this channel's profile right now. Nothing was changed.** ## Disconnect a channel 1. Open **Connected Accounts**. 2. On the channel, open the **⋮** menu and click **Disconnect**. 3. The **Disconnect channel** window opens. You can pick a reason. This is optional and helps us improve. 4. Click **Disconnect**. What happens: - You can no longer post to this channel. - We remove Schedule & Chill's access on the platform where the platform allows it. - Your published posts and their analytics **stay**. - The channel no longer counts toward your channel limit. ## Connect a disconnected channel again Click **Connect** for that platform under **Add a channel** and sign in with the same account. Schedule & Chill restores the same channel with its history. This counts toward your channel limit again. --- Source: https://schedulenchill.com/help/channels/groups # Channel groups A **channel group** is a saved set of channels — for example one brand, one client, or one language. Pick the group when you write a post, and all its channels are selected at once. Groups only hold channels. They have no captions or settings of their own. ## Before you start You need **at least 2 connected channels**. The **Channel groups** card only appears on **Connected Accounts** once you have two. ## Create a group 1. In the left menu, click **Connected Accounts**. 2. In the **Channel groups** card, click **New group**. 3. In **Group name**, type a name, for example "Client A". Each name must be unique. 4. Under **Channels**, tick the channels for this group. 5. Click **Create group**. You see **Group created**. ## Edit or delete a group - To change a group, click **Edit**, update the name or channels, and click **Save changes**. - To remove a group, click **Delete**, then **Delete** again to confirm. Your channels stay connected. Only the shortcut is removed. ## Where you can use groups | Place | How | |---|---| | **Create Post** and **Bulk compose** | Click a group chip in the **Groups** row to select its channels | | **Posts** | Filter with **All groups** | | **Calendar** | Filter with **All groups** | | **Analytics** | The channel filter lists your groups | Good to know: - If a channel in the group is disconnected or needs reconnecting, it is skipped when you pick the group. - A group whose channels are all inactive is hidden in the composer. --- Source: https://schedulenchill.com/help/posts/write-a-post # Write and publish a post ## Before you start Connect at least one channel. Without one, **Create Post** shows **Connect a channel to start posting** and a **Connect accounts** button. See [Connect a social channel](/help/channels/connect). ## Write your post 1. Click **Create Post** at the top of the left menu. 2. **Pick your channels.** Click each channel you want to post to, or click a [channel group](/help/channels/groups) to select several at once. Pick channels **before** adding media — each platform allows a different number of files. 3. **Write your caption** in the text box. The counter under it shows how many characters you have left on the strictest selected platform. Hover over it to see every platform. 4. **Add media (optional).** Click the add tile under **Media** to pick files from your library or upload new ones. See [Add images, video or a PDF](/help/posts/media). 5. **Add a first comment (optional).** Click **Add first comment**. It is posted as a comment right after the post, on the platforms that support it. 6. **Check the preview** on the right. With several platforms, switch between them at the top of the preview. 7. **Choose when it goes out** and click the button — see below. ## Publish, schedule or save | Button | What happens | |---|---| | **Post Now** | Publishes right away. This is the default when no date is picked. | | **Schedule Post** | Shows instead of Post Now once you pick a date and time. Publishes at that time. | | **Save as Draft** | Saves the post without publishing. Drafts do not count toward your monthly limit. | | **Cancel** | Leaves without saving. | After publishing or scheduling, you land on the **Posts** page. For every way to pick a time, see [Choose when a post goes out](/help/posts/when-to-publish). ## Why the buttons are grey The buttons stay disabled until: - the caption is not empty — **even a draft needs some text** - at least one channel is selected - the post fits every selected platform's rules. A message explains what to fix, for example **Only 4 images per post — 6 attached.** **Post Now** and **Schedule Post** are also disabled when you have used all your posts for the month. You can still save drafts. ## Send different text to each channel When you select two or more channels, tabs appear above the caption. See [Different text for each channel](/help/posts/per-channel-text). ## Get back unsaved work The composer saves your work in this browser as you type. If you leave and come back to **Create Post**, you see **Restore your unsaved draft?** Click **Restore draft** to continue, or **Discard**. - This only works in the same browser, for up to 7 days. - Platform settings, like a YouTube title, are not saved this way. - Click **Restore draft** or **Discard** before you start typing, or the old draft is replaced. --- Source: https://schedulenchill.com/help/posts/when-to-publish # Choose when a post goes out Times are shown in the time zone from your settings. New accounts start in **UTC** — set yours first in [Profile and time zone](/help/account/profile-timezone). The composer shows the zone under the date field, for example **Times are in Asia/Dhaka (GMT+6)**. ## Publish now Leave **Schedule (optional)** empty and click **Post Now**. The post goes out within seconds. ## Publish at a date and time 1. Click the field under **Schedule (optional)** and pick a date and time in the future. 2. The button changes to **Schedule Post**. Click it. ## Use the next open slot If you have a [posting schedule](/help/posts/queue-slots), an **Add to queue** button shows next to **Schedule (optional)**. 1. Click **Add to queue**. It lists up to three **Next open slots** in the next 14 days. 2. Pick one. It fills in the date and time. 3. Click **Schedule Post**. A slot is skipped when another scheduled post already sits at that exact time. Slots are not reserved until you click **Schedule Post**. ## Keep it as a draft Click **Save as Draft**. A draft never publishes, even if you picked a time. Open it later from **Posts → Drafts**. ## Change the time later - **One post:** open it with **Edit**, change the date, and click **Schedule Post** or **Save Changes**. - **Several posts:** select them on the **Posts** page and click **Reschedule**. - **Calendar:** drag the post to another day. See [Use the calendar](/help/manage/calendar). - **Publish early:** open the **…** menu on the post and click **Post now**. Careful when editing: - On the edit page, **Save Changes** on a draft that has a date **schedules** it. - To stop a scheduled post from publishing, select it on the **Posts** page and click **Mark Draft**. Don't just clear the date on the edit page — the post stays scheduled without a time. ## Your monthly post limit You can publish up to **500 posts per month**. - Every post you publish or schedule counts, once per channel post, in the month you create it. - Drafts don't count. - When you have 5 or fewer left, the composer warns you. When none are left, you can only save drafts. - The count resets on the first day of each month. There is also a daily limit per platform: 25 posts per platform, or 10 for YouTube. See [When a post fails](/help/manage/failed-posts). --- Source: https://schedulenchill.com/help/posts/per-channel-text # Different text for each channel When you post to several channels, you can keep one shared caption or give any channel its own text. This is useful when one platform needs a shorter caption. ## Customize one channel 1. In **Create Post**, select two or more channels. Tabs appear above the caption. 2. The first tab, **All channels**, is the shared caption. Every channel posts it unless you customize that channel. 3. Click a channel's tab. Its box starts with the shared caption. 4. Change the text. The tab now shows a violet **Custom** badge. 5. That channel's platform settings are also in its tab. To undo, open the tab and click **Reset to shared caption**. ## How the tabs behave - If a custom caption is empty or the same as the shared caption, the channel simply uses the shared one. - Once you change a channel's text, later edits to **All channels** no longer change that channel. Update it by hand, or click **Reset to shared caption**. - An orange **!** on a tab means that channel can't post as it is. Open the tab to see why, for example a caption that is too long. - If you remove channels until only one is left, its custom text becomes the main caption. - The character counter in a channel's tab counts that platform only. ## Good to know - There is one **first comment** for all channels. You cannot set a different first comment per channel. - If two channels are on the same platform, the preview shows only the first one. - **Duplicate** does not copy custom captions. See [Edit, duplicate or delete a post](/help/manage/edit-duplicate-delete). - Bulk compose and CSV import use one caption for every channel. --- Source: https://schedulenchill.com/help/posts/media # Add images, video or a PDF to a post ## Before you start **Pick your channels first.** Each platform allows a different number of files, and the composer only lets you attach as many as the strictest selected platform accepts. See [What each platform accepts](/help/posts/platform-rules). ## Attach files 1. In **Create Post**, under **Media**, click the add tile (**Add or upload media**). 2. The **Select Media** window opens. The badge shows how many you picked out of the most you can attach, for example **2/4**. 3. Click files from your library to select them. Use **Search media...** to find one by name. 4. To add a new file, click **Upload** and choose images, a video or a PDF. New files appear at the top and are selected for you. 5. Close the window. Your files show under **Media**. ## Set the order Drag the files to reorder them. The order you see is the order they appear in the post, for example in a LinkedIn image post. Click a file to view it full size. ## Rules to know - **Images, video and PDFs don't mix.** A post has either images, or one video, or one PDF. If you try to add a PDF next to images, you see **Not on the same post**. - **Audio** can live in your library, but it can't be attached to a post. - When you reach the most files allowed, extra clicks do nothing. - If you add a channel after picking media, the post may break that platform's rule, for example **Only 4 images per post — 9 attached.** Remove files or remove the channel. ## File size | Where you upload | Largest file | |---|---| | **Upload** in Create Post | 90 MB | | **Media Library** page | 100 MB | | An AI tool or the API | 400 MB | Bigger video? Ask your connected AI tool to upload it from your computer. See [Connect your AI tool](/help/ai-tools/connect-ai-tool). ## If an upload fails You see **… file(s) failed** with the reason. The usual causes: - the file is too large for this upload path — see the table above - the format is not supported — use JPG, PNG, GIF, WebP, MP4, MOV, WebM, M4V or PDF Uploaded files stay in your [Media library](/help/media/library) for next time. --- Source: https://schedulenchill.com/help/posts/platform-settings # Platform settings in the composer Some platforms have options that only make sense there, like a video title on YouTube. Schedule & Chill shows them in the composer when you select a channel on that platform. ## Where to find them - **One channel selected:** the settings show under the caption, with a heading like **LINKEDIN SETTINGS**. - **Several channels selected:** open that channel's tab above the caption. Its settings are inside the tab. Settings apply to that channel only. ## Which platforms have settings | Platform | Settings | Details | |---|---|---| | LinkedIn | Who can see the post, link preview card | [Connect LinkedIn](/help/channels/linkedin) | | YouTube | Title, description, privacy, category, made for kids | [Connect YouTube](/help/channels/youtube) | | Bluesky | None | [Connect Bluesky](/help/channels/bluesky) | | Mastodon | None | [Connect Mastodon](/help/channels/mastodon) | ## Good to know - Required settings, like **Is this made for kids?** on YouTube, have a default you can change. - If a setting is not valid, you see a message like **Video title must be 100 characters or fewer.** - **Duplicate** does not copy platform settings. - Bulk compose and CSV import do not have platform settings. Those posts use the defaults. - Unsaved-work recovery does not keep platform settings. Check them again after you restore a draft. --- Source: https://schedulenchill.com/help/posts/platform-rules # What each platform accepts Every platform has its own rules. Schedule & Chill checks your post against them **before** it is scheduled, so a post does not fail later. ## The rules for each platform | Platform | Text limit | Images | Video | PDF | Needs media | First comment | |---|---|---|---|---|---|---| | LinkedIn | 3,000 characters | Up to 9 | 1 | 1 PDF, up to 300 pages and 100 MB | No | Yes | | Bluesky | 300 characters | Up to 4 | No | No | No | No | | Mastodon | 500 characters (your server may allow more) | Up to 4 | 1 | No | No | Yes | | YouTube | 5,000 characters | No | 1 | No | Yes, a video | No | No platform above accepts images and video in the same post. A PDF is always posted on its own. ## When you post to several platforms at once - The composer lets you attach only as many files as the **strictest** selected platform allows. - If your post breaks a rule on one platform, the composer shows a message for that channel, for example **Only 4 images per post — 6 attached.** Fix it, remove that channel, or give that channel its own caption. See [Different text for each channel](/help/posts/per-channel-text). ## How characters are counted - **X:** every link counts as 23 characters and every emoji as 2. - **Bluesky:** an emoji counts as 1 character, even complex ones. - **Mastodon:** every link counts as a fixed number of characters set by your server, usually 23. Your server can also allow more text than the default. - **All others:** every character counts as 1. If a caption is too long, you see **The caption is … characters; the limit is ….** ## Messages you may see in the composer | Message | What to do | |---|---| | **Needs at least one video.** | Add a video. | | **Needs at least one image or video.** | Add an image or a video. | | **Video isn't supported.** / **Images aren't supported.** | Remove that media, or post it to a different channel. | | **Images and video can't share a post.** | Use only images or only a video. | | **PDFs aren't supported.** | PDFs work on LinkedIn only. | | **A PDF can't share a post with images or video.** | Post the PDF on its own. | | **… is an audio file. Audio is stored in your library for editing, but it cannot be attached to a post.** | Audio can live in your library but cannot be posted. | --- Source: https://schedulenchill.com/help/posts/queue-slots # Set a weekly posting schedule A **schedule template** is a list of times you like to post each week, for example "Monday 9:00, Wednesday 9:00, Friday 16:00". Once you have one, the composer offers your next open slots, so you don't have to pick a time every time. ## Create a schedule template 1. Open **Schedule Templates**. You find it on your **Settings** page (click your name at the bottom of the left menu, then **Settings**, then **API Keys**), in the **Schedule Templates** card. 2. Click **Create Template**. 3. In **Template name**, type a name, for example "Weekday mornings". 4. For each posting time, choose a day and a time. Click **Add slot** to add more. 5. Tick **Set as default template** if you want the composer to use this one. 6. Click **Create**. Each template card shows its slots by day, and **… slots/week** with its time zone. Good to know: - A template uses the time zone of **your browser** when you create it. - Only one template can be the default. If none is marked, the oldest template is used. - **Sunday** slots are not offered in **Add to queue** at the moment. Use Monday to Saturday slots, or pick Sunday times by hand. ## Use your schedule - **Create Post:** click **Add to queue**, pick a slot, then click **Schedule Post**. See [Choose when a post goes out](/help/posts/when-to-publish). - **Bulk compose:** click **Fill times from queue** to fill every empty time. See [Create many posts from files](/help/posts/bulk-compose). - **AI tools:** ask your AI tool to schedule a post in the next slot. A slot counts as taken when any scheduled post already sits at that exact time. Drafts don't take slots. ## Edit or delete a template - Click the pencil icon on a template, change it, and click **Update**. - Click the trash icon, then **Delete**. Posts that are already scheduled are not changed. --- Source: https://schedulenchill.com/help/posts/bulk-compose # Create many posts from files **Bulk compose** turns each image or video into its own post. It is the fastest way to queue a week of content. ## Before you start - Upload your images and videos to the [Media library](/help/media/library) first, or upload them while you pick files. - Bulk compose uses one caption per post. It has no custom captions per channel and no platform settings. If you need those, use **Create Post** for that post. ## Create the posts 1. In the left menu, click **Posts**. 2. Click **Bulk Schedule**, then **Compose from files**. 3. Under **Channels**, pick the channels every post goes to. You can click a [channel group](/help/channels/groups). 4. Click **Add files** and choose your images or videos. Each file becomes one post. 5. For each post: - write its caption - pick a date and time, or leave it empty to save that post as a draft - click **Remove this post** to drop one 6. Optional: click **Fill times from queue** to fill every empty time from your [posting schedule](/help/posts/queue-slots). **Clear times** empties them again. 7. Click **Create … posts**. You see a message like **5 posts scheduled. 2 saved as drafts.** ## Limits - Up to **50 posts** in one batch. - Every post needs a caption. - Every post is checked against each platform's rules before anything is created. If one post breaks a rule, nothing is created and you see **Post …: …** with the problem. Fix it and try again. - If the batch is bigger than what is left of your monthly post limit, you see **This would schedule … posts but only … remain on your plan this month.** ## Channels that can't be used here Some channels need settings for every single post, so they are not available in bulk compose. They show in a gray box, **… can't be bulk composed**, with a button to **Open the single post composer**. --- Source: https://schedulenchill.com/help/posts/csv-import # Import posts from a CSV file Use a CSV file when your posts are already in a spreadsheet. CSV import creates **text posts only** — to post images or video in bulk, use [Create many posts from files](/help/posts/bulk-compose). ## Prepare your CSV file The first row must be the column names. Only `content` is required. | Column | Required | What to put in it | |---|---|---| | `content` | Yes | The post text, up to 10,000 characters. It must also fit every selected platform's limit. | | `scheduled_at` | No | When to publish. Leave empty to save the post as a draft. | | `first_comment` | No | A first comment, up to 5,000 characters | Example: ```csv content,scheduled_at,first_comment "Monday tip: batch your content on Sunday.",2026-09-21T09:00:00+06:00, "New blog post is live!",2026-09-22T09:00:00+06:00,"Read it here: https://example.com" ``` Rules: - Up to **100 rows** and **1 MB**. - **Always add your time zone offset** to `scheduled_at`, like `+06:00` in the example. A time without an offset is read as UTC. - Keep each caption on **one line**. A caption with line breaks inside it is split into broken rows. - Column names are not case sensitive. ## Import the file 1. In the left menu, click **Posts**. 2. Click **Bulk Schedule**, then **Import a CSV**. 3. Drop your file into **Upload CSV file**, or click to browse. Click **Next**. 4. Check the **CSV Preview**. It shows the columns it found and the first 5 rows. Fix any yellow warning, then click **Next**. 5. In **Post to accounts**, select the channels. Every row goes to all the channels you select. 6. Under **Schedule strategy**, choose **Use dates from CSV**. 7. Click **Import**. You see **Import started**. The import runs in the background. A progress bar on the **Posts** page shows how many rows are done. When it finishes you see **Import Complete** with the number of imported and failed posts. ## Good to know - Choose **Use dates from CSV**. The **Auto-fill schedule template** option currently saves every row as a draft without a time. - A `platforms` column is ignored. Pick the channels in step 5 instead. - The import tells you how many rows failed, but not which ones. Compare the posts on the **Posts** page with your file to find the missing rows. The usual reasons are a caption that is too long for a platform, or an empty `content`. --- Source: https://schedulenchill.com/help/manage/posts-page # Find and manage your posts The **Posts** page lists everything you have written: drafts, scheduled posts, published posts and posts that failed. Open it from **Posts** in the left menu. ## How posts are grouped When you send one post to several channels, it appears as **one card** with a chip for each channel. Actions like **Delete** or **Post now** apply to every channel in that card. ## Status tabs | Tab | Shows | |---|---| | **All** | Every post | | **Scheduled** | Posts waiting for their time, including ones publishing right now | | **Publishing** | Posts being sent to a platform at this moment | | **Published** | Posts that went out. A post that failed on only some channels shows here too. | | **Drafts** | Posts without a publish time | | **Needs attention** | Posts that failed on at least one channel | While a post is publishing, the page updates by itself. ## Search, filter and sort - **Search posts...** finds posts by their main caption. - **All platforms** shows only posts for one platform. - **All groups** shows only posts for one [channel group](/help/channels/groups). - **Newest** or **Soonest** changes the order. - Switch between **card** and **table** view with the buttons next to the filters. ## Open a post's details Click a post card, or open the **…** menu and click **View details**. The **Post details** panel shows: - when it was published or is scheduled, in your time zone - the media, the caption with a **Copy** button, and the first comment - every channel with its own status, its custom caption if it has one, the error if it failed, and a **View on …** link once it is live ## Actions on one post Open the **…** menu on a post: | Action | When you can use it | |---|---| | **View details** | Always | | **Post now** | Drafts and scheduled posts | | **Retry now** | Posts that failed on every channel | | **Edit** | Drafts and scheduled posts | | **Duplicate** | Always. The copy is saved as a draft. | | **Delete** | Always | For posts that failed, see [When a post fails](/help/manage/failed-posts). For what each action changes, see [Edit, duplicate or delete a post](/help/manage/edit-duplicate-delete). ## Act on many posts at once 1. Tick the checkbox on each post you want. You can select up to 50. 2. A bar appears at the bottom. Choose an action: | Button | What it does | |---|---| | **Post now** | Publishes drafts, scheduled and failed posts right away | | **Duplicate** | Copies the posts as drafts | | **Reschedule** | Moves drafts and scheduled posts to a new date and time. Failed posts are skipped. | | **Mark Draft** | Turns scheduled and failed posts back into drafts and removes their time | | **Delete** | Deletes the posts | | **Clear** | Unselects everything | If you are near your monthly post limit, some drafts stay as drafts. The message tells you how many. --- Source: https://schedulenchill.com/help/manage/calendar # Use the calendar The calendar shows your posts on a month view, so you can spot empty days and move posts around. ## Open the calendar 1. In the left menu, click **Posts**. 2. Click **Calendar** at the top. ## Read the calendar - It shows one month at a time. Weeks start on Monday. - Use the arrows to go to the previous or next month, and **Today** to come back. - Each post shows its time, a picture if it has one, and the start of its caption. - Colors show the status: **violet** = scheduled, **green** = published, **red** = failed, **gray** = draft. - Times use the time zone in your profile. See [Profile and time zone](/help/account/profile-timezone). - Drafts **without** a time do not appear. Find them on the **Posts** page under **Drafts**. - If you have channel groups, filter with **All groups**. A post that failed on only some channels shows as green here. Check the **Needs attention** tab on the **Posts** page for those. ## Open a post - Click a **scheduled** or **draft** post to open it in the editor. - Click a **published** or **failed** post to see its details on the **Posts** page. ## Move a post to another day 1. Drag a scheduled post onto another day. 2. Drop it. The post keeps its time of day and moves to the new date. You see **Post rescheduled.** Good to know: - You can only drag **scheduled** and **draft** posts. - Dropping a **draft** on a day turns it into a **scheduled** post. It will publish on that day. - You cannot drop a post on a time that has already passed. You see **Couldn't reschedule** and the post goes back. - Dragging works with a mouse. On a phone or tablet, open the post and change its time instead. To create a post from here, click **New post**. To go back to the list, click **List view**. --- Source: https://schedulenchill.com/help/manage/failed-posts # When a post fails Sometimes a platform refuses a post. Schedule & Chill keeps the post, shows you the reason, and lets you retry. ## How you find out - A notification: **Your post failed to publish** or **Your post partially published**. - An email with the same title, listing each failed channel and its error. - A red banner on the **Posts** page: **… need attention — some channels failed to publish.** Click **Review failed**. - The **Needs attention** tab on the **Posts** page. ## Read the reason On the post card, a red box shows one line per failed channel, for example **LinkedIn: …**. The text after the platform name is the platform's own error. Open the post's details to see it next to each channel. A post can fail on **some** channels and succeed on others. That is a **partial failure**. The channels that worked are not posted again when you retry. ## Retry a post 1. Fix the cause first (see the table below). 2. On the post card, click **Retry** in the red box. You see **Retrying failed post now.** Only the failed channels are sent again. For a post that failed on every channel, you can also use **Retry now** in the **…** menu or in the post details. ## Before you retry: check the platform If you see **Publishing was interrupted before the platform confirmed it. The post may already be live on this channel — check it before retrying.**, open your profile on that platform first. If the post is already there, do not retry — you would post it twice. ## Common reasons and fixes | Error | Fix | |---|---| | A **Reconnect …** button on the card, or words like *token*, *expired*, *unauthorized* | The channel lost access. Reconnect it from **Connected Accounts**, then retry. See [Reconnect or disconnect a channel](/help/channels/fix-or-disconnect). | | **Daily … publishing limit reached (… posts).** | You published the most posts allowed for that platform today: 25 per platform, 10 for YouTube. Retry the next day. | | **YouTube requires a video file to publish.** | YouTube needs one video. Add it and post again. | | **Mastodon took too long to process the attachment.** | Your Mastodon server was slow. Retry. | | **LinkedIn video did not finish processing within the allowed time** | LinkedIn was slow with the video. Retry, or use a smaller video. | | **LinkedIn document error: file exceeds LinkedIn's 100MB limit for document posts.** | Make the PDF smaller than 100 MB. | | **This LinkedIn account is missing its member id. Reconnect it.** | Reconnect the LinkedIn channel. | ## If the first comment fails The post itself stays **published**. The post details show **Posted, but the first comment failed: …**. There is no retry for the comment — add it by hand on the platform if you need it. ## You cannot edit a failed post Failed posts cannot be opened in the editor. To change the text or media: 1. Open the **…** menu and click **Duplicate**. The copy is a draft. 2. Edit the draft and schedule it. 3. Delete the failed post if you no longer need it. Or select the post and use **Mark Draft** in the bottom bar, then edit it. --- Source: https://schedulenchill.com/help/manage/edit-duplicate-delete # Edit, duplicate or delete a post ## Edit a post You can edit **drafts** and **scheduled** posts. 1. On the **Posts** page, open the **…** menu on the post and click **Edit**. From the calendar, click the post. 2. Change the caption, media, channels, time or settings. 3. Save. You see **Post updated successfully!** or **Post scheduled successfully!** Good to know: - If the post goes to several channels, your caption, first comment and media changes apply to all of them. Each channel keeps its own time, custom caption and settings. - You cannot edit a post while it is publishing. - You cannot edit a **published** or **failed** post. For a failed post, see [When a post fails](/help/manage/failed-posts). ## Publish a scheduled post now Open the **…** menu and click **Post now**, then confirm with **Publish now**. The post goes out right away instead of at its time. ## Duplicate a post Open the **…** menu and click **Duplicate**. You see **Post duplicated as draft.** | Copied | Not copied | |---|---| | The main caption | Custom captions for single channels | | The first comment | Platform settings, like YouTube title or privacy | | The media, in the same order | The publish time — the copy is a draft | | The channels that are still connected | | Open the draft, add what you need, and schedule it. ## Delete a post 1. Open the **…** menu and click **Delete**. 2. Confirm with **Delete**. You see **Post deleted successfully!** - If the post goes to several channels, deleting removes it from **all** of them in Schedule & Chill. - Deleting in Schedule & Chill does **not** remove a post that is already live on the platform. Delete it on the platform too. - Deleted posts disappear from the list and the calendar. The app has no screen to bring them back. Deleted a post by mistake? If you use an AI tool connected to Schedule & Chill, ask it to restore the post. Otherwise click **Send feedback** in the left menu and tell us which post. --- Source: https://schedulenchill.com/help/manage/notifications # Notifications and emails ## The notification bell The bell sits at the top of the left menu, next to the logo. A red number shows unread notifications. - Click the bell to see your latest 10 notifications. - Click a notification to open the post or page it is about. It is marked as read. - Click **Mark all read** to clear the count. - When there is nothing new, you see **You're all caught up**. The bell updates when you open another page, not while you stay on one page. ## What you get notified about | Event | Notification | Email too? | |---|---|---| | A post published on all its channels | **Your post was published** | No | | A post failed on some channels | **Your post partially published** | Yes | | A post failed on every channel | **Your post failed to publish** | Yes | | A channel lost access | **Reconnect …** | Only if posts are scheduled to that channel | Emails about failed posts list every failed channel with its error, and have a **View this post** button. ## Act on a failed post notification Click the notification. The post's details open, with the reason next to each channel. Then follow [When a post fails](/help/manage/failed-posts). ## Act on a reconnect notification Click the notification. **Connected Accounts** opens. Reconnect the channel — see [Reconnect or disconnect a channel](/help/channels/fix-or-disconnect). If you click a notification about a post you already deleted, you see **That post no longer exists.** --- Source: https://schedulenchill.com/help/media/library # Use your media library The **Media Library** keeps every file you upload, so you can reuse it in any post. Open it from **Media Library** in the left menu. ## Upload files 1. Click **Upload Media**, or drag files onto the page and drop them when you see **Drop to upload**. 2. Wait for the upload to finish. Stay on the page — leaving stops uploads that are still running. You can upload: | Type | Formats | Can be posted? | |---|---|---| | Images | JPG, PNG, GIF, WebP | Yes | | Video | MP4, MOV, WebM, M4V | Yes | | PDF | PDF | Yes, on LinkedIn | | Audio | MP3, WAV, M4A, AAC | No — stored for editing only | Files can be up to **100 MB** each on this page. Large images may be resized before upload to keep them fast. ## Find a file - **Search media...** finds files by their file name. - Filter by **All**, **Images**, **Videos**, **Audio** or **PDFs**. - Sort by **Newest**, **Oldest**, **Largest** or **A–Z**. - Turn on **Unused only** to see files that are not in any post. The tiles at the top show your totals and how much storage you use. ## Add tags and a description Click a file to open its details. - **Tags** — type a tag and press Enter. Up to 50 characters each. - **Alt Text** — describe what is in the file, up to 500 characters. It helps people using screen readers, and it lets [AI tools](/help/ai-tools/connect-ai-tool) find the file when you ask for it in plain words. - **Folder** — a label like "products" or "blog". Click **Save Changes**. You see **Media details updated successfully**. The file name can't be changed. From the same panel you can open the file in a new tab, copy its link, or **Download** it. ## Use a file in a post In **Create Post**, click the add tile under **Media** and pick the file. See [Add images, video or a PDF](/help/posts/media). ## Delete files **One file:** open it, click **Delete**, and confirm. **Several files:** 1. Tick the files, or use **Select all on this page**. 2. Delete and confirm. Deleting is **permanent**. If a file is used in posts, the confirmation tells you. Deleting removes it from those posts, and scheduled posts will publish **without** it. --- Source: https://schedulenchill.com/help/analytics # Understand your analytics The **Analytics** page shows how your published posts perform. Open it from **Analytics** in the left menu. ## Choose what to look at - Pick **7 days**, **30 days** or **90 days**. The default is the last 7 days, in your time zone. - Use the channel filter to see one channel, a [channel group](/help/channels/groups), or a disconnected channel. History stays after you disconnect. ## What each number means | Card | Meaning | |---|---| | **Reach** | How many accounts saw your posts. Each platform counts this its own way. | | **Engagement** | Likes, comments and shares added together | | **Engagement rate** | Likes, comments and shares divided by impressions, as a percentage. Averaged per post. | | **Posts published** | How many posts went out in this range | A **—** with **Not reported** means the platform does not give us that number. It is not a zero. Below the cards: - **Reach and engagement** — a chart over time - **Channel performance** — your channels ranked. Switch between **By channel** and **By platform**. Click a channel to filter the page. - **Top performing posts** — your best 5 posts by engagement rate - **Best times to post** — a grid of your average engagement rate by day and hour ## Which platforms report numbers | Platform | Impressions | Reach | Likes | Comments | Shares | Video views | Engagement rate | |---|---|---|---|---|---|---|---| | LinkedIn | None — LinkedIn does not share post numbers for personal profiles | | | | | | | | Bluesky | — | — | Yes | Yes | Yes | — | — | | Mastodon | — | — | Yes | Yes | Yes | — | — | | YouTube | Yes | Yes | Yes | Yes | — | Yes | Yes | The chart, the engagement rate and **Best times to post** need a platform that reports impressions. If none of your channels do, those sections stay empty on purpose — we never show a number we did not measure. ## How often numbers update | Post age | Updated | |---|---| | First 7 days | About every 6 hours | | Day 7 to day 30 | Once a day | | Older than 30 days | Not updated any more. The last numbers stay. | New numbers can take up to 15 minutes to show on the page. ## If numbers are missing | You see | Why | |---|---| | **No channels connected** | Connect a channel first. See [Connect a social channel](/help/channels/connect). | | **Collecting your metrics** | Your posts are new. Numbers arrive a few hours after publishing. | | **Nothing published in this range** | Pick a wider range, or clear the channel filter. | | **… does not report post analytics** | That platform gives no numbers for your account type. This will not fill in later. | | A disconnected channel stopped updating | Reconnect it to collect numbers again. | --- Source: https://schedulenchill.com/help/ai-tools/connect-ai-tool # Connect your AI tool Schedule & Chill works inside the AI tools you already use. Once connected, you can ask in plain language, for example *"write a LinkedIn post about what I shipped this week and schedule it for tomorrow at 9"*. Open **Connect AI Tool** in the left menu to start. ## Option 1 — connect with one link (recommended) No API key and no config file. 1. On **Connect AI Tool**, copy the connection URL in **Connect with one link**. 2. Add it to your tool: - **Claude:** Settings → Connectors → Add custom connector → paste the URL. - **ChatGPT:** Settings → Connectors → Add. This needs a paid ChatGPT plan with developer mode on. - **Cursor or VS Code:** add it as an MCP server. They open an approval page in your browser. 3. Your tool opens a Schedule & Chill approval screen. Approve it. Your password is never shared with the tool. ## Option 2 — connect with an API key Use this for tools that want a key in a config file. 1. On **Connect AI Tool**, under **Create a key**, click **Create key**. 2. Copy the key right away. **You won't see it again.** 3. Under **Add it to your tool**: - click **Add to Cursor** or **Add to VS Code** — both ask you to confirm before anything is written, or - copy the **Claude Code** command and run it once in your terminal. 4. For Claude Desktop, Gemini CLI, Codex, Windsurf, Zed and others, follow the developer guide [Connect Your AI Tool](/docs/mcp/connect). ## Try it Paste this into your AI tool: > Using Schedule & Chill, list my connected social accounts. Then write a short LinkedIn post about what I shipped this week and schedule it for 5 minutes from now — show me the draft first so I can approve it. The tool reads your accounts first, so nothing is published until you approve. ## Good to know - The AI tool can do the same things you can: schedule, publish, edit, delete and restore posts, and use your media library. - Ask it to show you the post before it publishes. Publishing cannot be undone. - The AI tool uses the same channels, limits and platform rules as the app. - To stop a tool that uses an API key, revoke the key. See [API keys](/help/ai-tools/api-keys). ## For developers The full tool reference, REST API and setup for every client are in the [developer docs](/docs). --- Source: https://schedulenchill.com/help/ai-tools/api-keys # API keys An **API key** lets a script, an app or an AI tool act on your Schedule & Chill account. You only need one if a tool asks for a key. For Claude, ChatGPT, Cursor and VS Code, the one-link option on **Connect AI Tool** needs no key — see [Connect your AI tool](/help/ai-tools/connect-ai-tool). ## Keep your keys safe - A key gives **full access** to your account: posts, channels and media. - Keys **do not expire**. They work until you delete them. - Treat a key like a password. Don't paste it into shared documents or public code. - Use one key per tool, so you can revoke one without breaking the others. ## Create a key **From Connect AI Tool:** 1. In the left menu, click **Connect AI Tool**. 2. Under **Create a key**, click **Create key**. It is named automatically, like "API key 1". 3. Copy it right away. **You won't see it again.** 4. To rename it, click **Rename** in the key list. **From Settings:** 1. Click your name at the bottom of the left menu, then **Settings**, then **API Keys**. 2. Click **Create your first key** (or the create button). 3. Optional: type a **Key Name**, for example "Claude Desktop". 4. Copy the key right away with **Copy**. ## Revoke a key - On **Connect AI Tool**: click the trash icon next to the key and confirm **Revoke this key? Any tool using it stops working.** - On **Settings → API Keys**: click the trash icon and confirm. Any tool using that key stops working at once. ## Lost a key? Keys can't be shown again. Create a new key, update your tool, and delete the old one. ## For developers See [API Keys in the developer docs](/docs/rest-api/api-keys) and the [REST API overview](/docs/rest-api). --- Source: https://schedulenchill.com/help/account/profile-timezone # Profile and time zone ## Set your time zone Every scheduled time, the calendar and your analytics use this time zone. New accounts start in **UTC**, so set yours first. 1. Click your name at the bottom of the left menu, then **Settings**. 2. In the settings menu, click **API Keys**. This page is called **Settings**. 3. In the **Preferences** card, open **Timezone** and search for your city or zone, for example `Asia/Dhaka` or `America/New_York`. 4. Click **Save Preferences**. You see **Preferences updated successfully.** Posts you already scheduled keep their exact moment in time. Only the way times are shown changes. ## Change your name or email 1. Click your name at the bottom of the left menu, then **Settings**. The **Profile** page opens. 2. Change **Name** or **Email address**. 3. Click **Save**. If you change your email, you must confirm the new address before you can use the app again. We send a link to the new address. To get it again, click the resend link on the Profile page. ## Other settings - [Password and two-factor authentication](/help/account/password-2fa) - [Appearance and emails](/help/account/appearance-emails) - [Your plan and limits](/help/account/plan-limits) - [Delete your account](/help/account/delete-account) --- Source: https://schedulenchill.com/help/account/password-2fa # Password and two-factor authentication ## Change your password 1. Click your name at the bottom of the left menu, then **Settings**, then **Password**. 2. Enter your **Current password**, a **New password** and **Confirm password**. 3. Click **Save password**. You see **Password updated successfully.** ### Signed up with Google or LinkedIn? Your account has no password yet, so **Current password** can't work. Create one first: 1. Sign out. 2. On the sign-in page, click **Forgot password?** and follow the email link. 3. Choose a new password. You can still sign in with Google or LinkedIn too. ## Turn on two-factor authentication Two-factor authentication (2FA) asks for a 6-digit code from your phone each time you sign in. You need an authenticator app, for example Google Authenticator, 1Password or Authy. 1. Click your name at the bottom of the left menu, then **Settings**, then **Two-Factor Auth**. 2. Confirm your password if asked. 3. Click **Enable 2FA**. 4. Scan the QR code with your authenticator app, or copy the setup key into it. Click **Continue**. 5. Enter the 6-digit code from the app and click **Continue**. The badge changes to **Enabled**. ## Save your recovery codes If you lose your phone, a recovery code lets you sign in. 1. On **Two-Factor Auth**, click **View Recovery Codes**. 2. Save them in a password manager. Each code works once. Click **Regenerate Codes** to get a new set — the old codes stop working. ## Sign in with 2FA 1. Enter your email and password as usual. 2. On **Enter your code**, type the 6-digit code from your app. Lost your phone? Click **Lost your device? Use a recovery code** and enter one of your saved codes. ## Turn off two-factor authentication On **Two-Factor Auth**, click **Disable 2FA**. --- Source: https://schedulenchill.com/help/account/appearance-emails # Appearance and emails ## Light or dark mode **Quick switch:** click your name at the bottom of the left menu and use the light/dark toggle. **Follow your computer's setting:** 1. Click your name at the bottom of the left menu, then **Settings**, then **Appearance**. 2. Choose **Light**, **Dark** or **System**. **System** follows your computer. ## Emails we send | Email | When | Can you turn it off? | |---|---|---| | Welcome and setup tips | After you sign up, at most two | Yes | | **Your post failed to publish** / **Your post partially published** | When a post fails on a channel | No — it is about your own posts | | **Reconnect …** | When a channel loses access and posts are scheduled to it | No — it is about your own posts | | Password reset and email confirmation | When you ask for them | No | Successful posts do not send an email. They show in the notification bell. See [Notifications and emails](/help/manage/notifications). ## Stop setup emails - Click **Stop these emails** at the bottom of a setup email, or - Click your name at the bottom of the left menu, then **Settings**, then **API Keys**. In **Preferences**, turn off **Email notifications** and click **Save Preferences**. Alerts about your own posts keep coming either way. --- Source: https://schedulenchill.com/help/account/plan-limits # Your plan and limits Schedule & Chill is **free**. There is no paid plan, no credit card and no trial clock. ## What you can use | Limit | What you get | |---|---| | Channels | You can connect up to **2 channels**. | | Posts per month | You can publish up to **500 posts per month**. | | Posts per day, per platform | 25, or 10 for YouTube | | File size | 90 MB from Create Post, 100 MB in the Media Library, 400 MB through an AI tool or the API | ## How posts are counted - Every post you **publish or schedule** counts once per channel. - **Drafts don't count.** - A post counts in the month you **create** it, not the month it publishes. - The count resets on the **first day of each month**. When you have used them all, you see **You've used all … posts included this month. Your allowance resets on ….** You can still write and save drafts. The daily limit per platform protects every account from one account using up a platform's shared allowance. A post over the daily limit fails with **Daily … publishing limit reached**. Retry it the next day. ## See what you have used - **Left menu:** the card at the bottom shows **… / … posts this month**. It turns yellow when 5 or fewer are left. - **Dashboard:** **Profiles connected** and **Posts this month**. - **Connected Accounts:** the badge at the top, for example **1 of 2**. ## Billing While Schedule & Chill is free there is nothing to buy. You can ignore the **Billing** page and any "upgrade" links. ## Need more? Tell us what you need: click **Send feedback** at the bottom of the left menu, or email support@schedulenchill.com. --- Source: https://schedulenchill.com/help/account/delete-account # Delete your account Deleting your account **permanently** removes your posts, media, connected channels, schedule templates and channel groups. It cannot be undone. Posts that are already live on LinkedIn, YouTube or other platforms stay there. Delete them on each platform if you want them gone. ## Before you delete - If you pay for a plan, cancel it first under **Billing → Manage billing**. - If you signed up with Google or LinkedIn, set a password first — the last step asks for it. See [Password and two-factor authentication](/help/account/password-2fa). - Download any media you want to keep from the [Media library](/help/media/library). ## Delete it 1. Click your name at the bottom of the left menu, then **Settings**. The **Profile** page opens. 2. Scroll to **Delete account** and click **Delete account**. 3. Enter your **Password**. 4. Click **Delete account**. You are signed out and taken to the home page. ## Just want a break? You don't have to delete anything. Disconnect your channels instead — your history stays. See [Reconnect or disconnect a channel](/help/channels/fix-or-disconnect). --- Source: https://schedulenchill.com/help/troubleshooting/faq # Common questions ## Which platforms can I post to? LinkedIn, Bluesky, Mastodon and YouTube. Other platforms are waiting for approval — see [Platforms that are not available yet](/help/channels/not-available-yet). ## How much does it cost? Schedule & Chill is **free**. There is no paid plan, no credit card and no trial clock. See [Your plan and limits](/help/account/plan-limits). ## Why did my post publish at the wrong time? Your time zone is probably still **UTC**, the default for new accounts. Set it in [Profile and time zone](/help/account/profile-timezone). Then edit or reschedule the post. ## Why can't I click Post Now? The caption is empty, no channel is selected, the post breaks a platform rule, or you used all your posts this month. The composer shows which. See [Write and publish a post](/help/posts/write-a-post). ## Why does my channel say Reconnect? The platform's access ran out or was removed. LinkedIn asks for this about every 60 days. See [Reconnect or disconnect a channel](/help/channels/fix-or-disconnect). ## My post failed. Will it try again by itself? No. Fix the cause, then click **Retry** on the post. See [When a post fails](/help/manage/failed-posts). ## Can I edit a post after it is published? No. Schedule & Chill cannot change a live post. Edit it on the platform, or duplicate it, change the copy and publish again. ## If I delete a post here, is it removed from LinkedIn too? No. Deleting in Schedule & Chill only removes it from the app. Delete the live post on the platform. ## Why are my LinkedIn analytics empty? LinkedIn does not share numbers for personal profiles with apps. See [Understand your analytics](/help/analytics). ## Can I post to two LinkedIn accounts? Yes, within your channel limit. Switch to the second account on LinkedIn, then click **Add another** on **Connected Accounts**. See [Connect a social channel](/help/channels/connect). ## Can my AI tool publish without asking me? It can if you tell it to. Ask it to show you the draft first. See [Connect your AI tool](/help/ai-tools/connect-ai-tool). ## Does disconnecting a channel delete my posts? No. Your posts and analytics stay, and reconnecting the same account restores everything. ## How do I get help from a person? Email support@schedulenchill.com. See [Contact support](/help/troubleshooting/contact). --- Source: https://schedulenchill.com/help/troubleshooting/contact # Contact support ## Email us Write to **support@schedulenchill.com**. A person reads every email. Include: - the email address of your Schedule & Chill account - what you tried to do, and what happened instead - the exact error text, or a screenshot - for a failed post: the channel and roughly when it should have published ## Send feedback from the app Click **Send feedback** at the bottom of the left menu. Pick a reason or write a line, then click **Send**. Feedback goes straight to the team and shapes what we build next. We don't reply to feedback, so for a problem you need solved, send an email instead. ## Help yourself first - [When a post fails](/help/manage/failed-posts) - [Reconnect or disconnect a channel](/help/channels/fix-or-disconnect) - [Common questions](/help/troubleshooting/faq) Tip: click **Copy as Markdown** at the top of any help page and paste it into ChatGPT or Claude with your question. --- Source: https://schedulenchill.com/docs # Schedule & Chill API Schedule & Chill schedules and publishes your social posts, and lets your AI tools do it for you. A native MCP server connects Claude Code, Cursor, Gemini CLI and other clients; a clean REST API covers the same ground from your own code. Several platforms are live and more have adapters built but still sitting in their platforms' review queues. This page deliberately does not list them — call `GET /api/capabilities` for the live list rather than assuming, because it changes as approvals land. ## Two ways to integrate - **REST API** — Standard HTTP + JSON. Create posts, upload media, manage connected accounts. Best for backends, cron jobs, and product features. - **MCP server** — A native [Model Context Protocol](https://modelcontextprotocol.io) server so AI agents (Claude, ChatGPT, or your own) can schedule posts, browse media, and read your queue as tools. Best for agentic and chat-based products. Both share the same authentication and the same underlying account. ## Base URL ``` https://schedulenchill.com/api ``` The MCP server lives at: ``` https://schedulenchill.com/mcp ``` ## Supported platforms X, LinkedIn (profiles and Pages), Facebook, Instagram, Pinterest, YouTube, and TikTok. See [Supported Platforms](/docs/reference/platforms) for the exact identifiers. ## What you can do - Schedule a post for later or publish immediately - Post the same content to many platforms at once, or customize text per platform - Attach images and video from a media library you manage over the API - List, update, and cancel scheduled posts - Read posting stats and connected accounts ## Next steps - [Quickstart](/docs/quickstart) — schedule your first post in five minutes. - [Authentication](/docs/authentication) — create an API key. - [Core Concepts](/docs/concepts) — how posts, platforms, and media fit together. --- Source: https://schedulenchill.com/docs/quickstart # Quickstart Schedule your first post in three steps. > **Just want to connect an AI tool?** You do not need any of this. Add > `https://schedulenchill.com/mcp-oauth` as a connector in Claude, ChatGPT, Cursor or > VS Code and approve the screen it shows you — no key, no config file. See > [Connect Your AI Tool](/docs/mcp/connect). The steps below are for the REST API. ## 1. Create an API key Sign in at [schedulenchill.com](https://schedulenchill.com), open **Settings → API Keys**, and click **Create Key**. Copy the token immediately — it is shown only once. All requests send the key as a bearer token: ```bash Authorization: Bearer YOUR_API_KEY ``` ## 2. Find a connected account Posts publish to _connected accounts_. List the accounts you have connected and grab an `id`: ```bash curl https://schedulenchill.com/api/posts \ -H "Authorization: Bearer YOUR_API_KEY" ``` To connect accounts (X, LinkedIn, etc.), use the dashboard under **Settings → Connected Accounts**. Over MCP you can list accounts with the `get_accounts` tool. ## 3. Schedule a post Create a post for one or more accounts. Omit `scheduled_at` and set `publish_now` to publish immediately. ```bash curl -X POST https://schedulenchill.com/api/posts \ -H "Authorization: Bearer YOUR_API_KEY" \ -H "Content-Type: application/json" \ -H "Accept: application/json" \ -d '{ "content": "Shipped our API today 🚀", "social_account_ids": [789], "scheduled_at": "2026-06-10T14:00:00Z" }' ``` A `201 Created` response returns the post with its `status` (`scheduled`), the attached accounts, and per-platform delivery status: ```json { "id": 123, "content": "Shipped our API today 🚀", "status": "scheduled", "scheduled_at": "2026-06-10T14:00:00Z", "socialAccounts": [ { "id": 789, "platform": "x", "pivot": { "status": "pending" } } ] } ``` That's it. From here: - [Authentication](/docs/authentication) — manage keys. - [Posts](/docs/rest-api/posts) — full create/update/list/delete reference. - [Media](/docs/rest-api/media) — attach images and video. - [MCP Server](/docs/mcp) — do the same from an AI agent. --- Source: https://schedulenchill.com/docs/authentication # Authentication There are two ways to authenticate, and which one you want depends on what you are connecting. | | For | What you do | | --- | --- | --- | | **OAuth** | AI tools with a "Connect" button — Claude, ChatGPT, Cursor, VS Code, Zapier | Paste one URL, approve a consent screen | | **API key** | The REST API, scripts, and editors that want a static header | Create a key, send it as a bearer token | ## OAuth (no key needed) If you are connecting an AI tool, use this. Point it at: ``` https://schedulenchill.com/mcp-oauth ``` Your tool discovers the rest on its own, sends you to a Schedule & Chill consent screen naming the tool and listing what it is asking for, and receives its own token when you approve. Nothing is copied or stored by you. Each tool holds a separate token, so revoking one does not affect the others, and your password is never shared. Full setup per tool: [Connect Your AI Tool](/docs/mcp/connect). This path is not available for the REST API — it authenticates with API keys only. ## API keys Send your key in the `Authorization` header on every request: ```bash Authorization: Bearer YOUR_API_KEY ``` A request without a valid key returns `401 Unauthorized`. ## Creating a key 1. Sign in and open **Settings → API Keys**. 2. Click **Create Key**, give it a name (e.g. _Production Server_, _Claude Desktop_). 3. Copy the token **immediately** — for security it is shown only once and cannot be retrieved later. If you lose it, revoke the key and create a new one. You can also manage keys over the REST API itself — see [API Keys](/docs/rest-api/api-keys). ## Using the key Send it on every request to the REST API and the MCP server: ```bash curl https://schedulenchill.com/api/posts \ -H "Authorization: Bearer YOUR_API_KEY" \ -H "Accept: application/json" ``` ## Token lifetime Keys do not expire automatically. They remain valid until you revoke them under **Settings → API Keys** (or via `DELETE /api/api-keys/{id}`). ## Security - Treat keys like passwords. Store them in a secrets manager or environment variables — never in client-side code or version control. - Use a separate key per integration so you can revoke one without affecting others. - Rotate keys periodically by creating a new one and revoking the old. ## Scope A key acts on behalf of the user who created it and can access that user's posts, media, and connected accounts. There are no per-key permission scopes yet. An OAuth token is scoped to `mcp:use`, which grants the MCP server and nothing else. A token issued for any other purpose is rejected at the MCP endpoint even though it authenticates. --- Source: https://schedulenchill.com/docs/concepts # Core Concepts A handful of objects make up the whole API. ## Connected accounts A **connected account** is a social profile you've authorized — an X handle, a LinkedIn profile or Page, etc. Each has an `id`, a `platform`, and an `is_active` flag. You publish _to_ connected accounts; their `id`s are what you pass to `social_account_ids` when creating a post. Accounts are connected from the dashboard under **Settings → Connected Accounts**. ## Posts A **post** is one piece of content targeted at one or more connected accounts. A post moves through a lifecycle: | Status | Meaning | | ----------- | ---------------------------------------- | | `draft` | Saved but not scheduled. | | `scheduled` | Queued to publish at `scheduled_at`. | | `published` | Sent to the platforms. | | `failed` | Publishing failed (see `error_message`). | Publish immediately by omitting `scheduled_at` and setting `publish_now: true`. Otherwise set a future `scheduled_at` (ISO 8601, UTC recommended). ### Per-account delivery Because one post can target several platforms, each post carries a per-account delivery record (the `pivot` on `socialAccounts`) with its own `status` (`pending`, `published`, `failed`), the resulting `platform_post_id`, and the public `platform_url`. One platform can succeed while another fails. ## Per-platform content By default every targeted account gets the same `content`. To tailor the text per platform (e.g. a short version for X, a longer one for LinkedIn), pass `platform_content` — an array mapping `account_id` to custom `content`. See [Posts](/docs/rest-api/posts). ## Media library The **media library** holds images and video you upload once and reuse across posts. Upload returns a `media` object with an `id`; attach media to a post by passing `media_ids`. Manage media via [Media](/docs/rest-api/media), or over MCP with `browse_media` and `upload_media`. ## Putting it together 1. Connect accounts (dashboard) → get account `id`s. 2. Optionally upload media → get media `id`s. 3. Create a post with `content`, `social_account_ids`, and optional `media_ids` / `scheduled_at`. 4. Read back the post to see per-account delivery status. --- Source: https://schedulenchill.com/docs/rest-api # REST API Overview The REST API is standard HTTP with JSON request and response bodies. ## Base URL ``` https://schedulenchill.com/api ``` The API is currently unversioned. Breaking changes will be announced in the [Changelog](/docs/reference/changelog). ## Authentication Send your API key as a bearer token on every request. See [Authentication](/docs/authentication). ```bash Authorization: Bearer YOUR_API_KEY ``` ## Request format Send JSON bodies with both headers set: ```bash -H "Content-Type: application/json" -H "Accept: application/json" ``` The `Accept: application/json` header ensures errors come back as JSON rather than HTML redirects. ## Resources | Resource | Endpoints | | ----------------------------------- | -------------------------------------------------------------------------------------------------------- | | [Posts](/docs/rest-api/posts) | `GET/POST /posts`, `GET/PUT/DELETE /posts/{id}` | | Post actions | `POST /posts/{id}/` `cancel` · `publish-now` · `retry` · `duplicate` · `restore` | | Analytics | `GET /analytics` | | Capabilities | `GET /capabilities` | | [Media](/docs/rest-api/media) | `GET/POST /media`, `GET/PUT/DELETE /media/{id}` | | [API Keys](/docs/rest-api/api-keys) | `GET/POST /api-keys`, `DELETE /api-keys/{id}` | Every post action has an MCP tool of the same name, and `GET /analytics` is `get_analytics`. Neither surface can do something the other cannot. ## Pagination List endpoints are paginated. The pagination fields sit at the top level of the response, alongside `data`: ```json { "data": [], "current_page": 1, "per_page": 20, "last_page": 5, "total": 100, "next_page_url": "…", "prev_page_url": null } ``` Pass `?page=2` to move through pages, and `?per_page=N` to change the page size. `per_page` accepts 1–200; anything larger returns `422` rather than being silently reduced, so a client is never quietly handed a short page. Without it, posts return 20 per page and media returns 15. Always compare `data.length` against `total` before concluding you have seen everything. ## Timestamps All timestamps are ISO 8601. Send `scheduled_at` in UTC (e.g. `2026-06-10T14:00:00Z`) to avoid ambiguity. ## Errors Errors use standard HTTP status codes with a JSON body. Validation failures return `422` with a field-keyed `errors` object. See [Errors & Status Codes](/docs/reference/errors). --- Source: https://schedulenchill.com/docs/rest-api/posts # Posts Create and manage posts. A post targets one or more connected accounts and can be a draft, scheduled for later, or published immediately. ## The post object | Field | Type | Description | | ---------------- | ------------ | ------------------------------------------------------------------------------------------------------ | | `id` | integer | Unique id. | | `content` | string | Default text for all targeted accounts. | | `status` | string | `draft`, `scheduled`, `published`, or `failed`. | | `scheduled_at` | string\|null | ISO 8601 publish time. | | `published_at` | string\|null | When it was sent. | | `error_message` | string\|null | Set when `status` is `failed`. | | `media` | array | Attached media objects. | | `socialAccounts` | array | Targeted accounts, each with a `pivot` delivery record (`status`, `platform_post_id`, `platform_url`, `error_message`). | Each account's `pivot.status` is one of `pending`, `publishing` (uploading/processing now), `published`, `failed`, or `blocked`. While a post is publishing, its top-level `status` stays `scheduled`; a `published` post that still has a `failed` account is a **partial** publish (partial is derived, not a stored status). Poll until no account is `pending` or `publishing`. --- ## Create a post ``` POST /api/posts ``` ### Body parameters | Parameter | Type | Required | Notes | | -------------------- | --------- | -------- | ----------------------------------------------------------------- | | `content` | string | yes | Max 10,000 characters. | | `social_account_ids` | integer[] | yes | At least one connected account id. | | `scheduled_at` | string | no | ISO 8601, must be in the future. Omit to publish now. | | `publish_now` | boolean | no | Publish immediately instead of scheduling. | | `media_ids` | integer[] | no | Media library ids to attach. | | `platform_content` | array | no | Per-account overrides: `[{ "account_id": 789, "content": "…" }]`. | ### Example ```bash curl -X POST https://schedulenchill.com/api/posts \ -H "Authorization: Bearer YOUR_API_KEY" \ -H "Content-Type: application/json" \ -H "Accept: application/json" \ -d '{ "content": "Big news for builders 🚀", "social_account_ids": [789, 790], "media_ids": [456], "scheduled_at": "2026-06-10T14:00:00Z", "platform_content": [ { "account_id": 790, "content": "Big news for builders. Full thread below 🧵" } ] }' ``` Returns `201 Created` with the post object. --- ## List posts ``` GET /api/posts ``` Paginated, 20 per page. Optional filters: | Query param | Description | | ----------- | ------------------------------------------------------ | | `status` | Filter by `draft`, `scheduled`, `published`, `failed`. | | `from` | Only posts scheduled on/after this date. | | `to` | Only posts scheduled on/before this date. | | `per_page` | Rows per page, 1–200. Over 200 returns 422. | `page` | Page number. | ```bash curl "https://schedulenchill.com/api/posts?status=scheduled&from=2026-06-01" \ -H "Authorization: Bearer YOUR_API_KEY" \ -H "Accept: application/json" ``` --- ## Retrieve a post ``` GET /api/posts/{id} ``` Returns the post with its `media` and `socialAccounts` (including per-account delivery status). --- ## Update a post ``` PUT /api/posts/{id} ``` Only `draft` and `scheduled` posts can be updated. Accepts the same fields as create. Attempting to update a `published` post returns `422`. --- ## Delete a post ``` DELETE /api/posts/{id} ``` Deletes the post. Returns `204 No Content`. This is a **soft delete** — the post is recoverable with the restore endpoint below. A `scheduled` post returns `409 post_not_cancelable`: cancel it first, so stopping an imminent publish is always a deliberate act rather than a side effect of a DELETE. --- ## Cancel a scheduled post ``` POST /api/posts/{id}/cancel ``` Stops a scheduled post before it publishes. Only posts in the `scheduled` state — anything else returns `409 post_not_cancelable`. Soft delete, so restore undoes it. --- ## Publish now ``` POST /api/posts/{id}/publish-now ``` Publishes a `draft`, `scheduled` or `failed` post immediately. Anything else returns `409 post_not_publishable`. Returns straight away — publishing runs in the background, so poll `GET /api/posts/{id}` for the per-channel outcome. A draft being promoted to live counts against the monthly post limit; a scheduled or failed post already spent its slot and is not charged again. --- ## Retry the failed channels ``` POST /api/posts/{id}/retry ``` Resends only the channels whose own publish failed, leaving channels that already published untouched — so a retry cannot double-post. Works on a partial outcome, where the post reads `published` but at least one channel did not make it. Returns `409 post_not_retryable` when nothing on the post failed. --- ## Duplicate a post ``` POST /api/posts/{id}/duplicate ``` Copies content, first comment, channels and media into a **new draft**. Nothing is scheduled or sent. Channels disconnected since the original was written are dropped and listed in `dropped_account_ids`. Returns `201` with the new post. --- ## Restore a post ``` POST /api/posts/{id}/restore ``` Undoes a cancel or a delete. A post whose scheduled time has already passed comes back as a **draft** rather than re-armed, so restoring never publishes anything by itself. Returns `409 post_not_deleted` if the post was never removed. --- Source: https://schedulenchill.com/docs/rest-api/media # Media Upload a file once, then attach it to any number of posts via `media_ids`. The library also works as a searchable asset store: `alt_text` and `tags` are searched as well as the filename, so a clip described as "cable crossover at the gym" is found by "gym" even though its filename is `PXL_20260806_113344.mp4`. Write a real `alt_text` at upload time — an item with no description is only findable by someone who already knows its filename. Audio (`mp3`, `wav`, `m4a`, `aac`) is accepted as a production input — music beds, voice takes — and can never be attached to a post. ## The media object | Field | Type | Description | | ------------------ | ------------- | ---------------------------------------- | | `id` | integer | Unique id. Pass to a post's `media_ids`. | | `original_name` | string | The uploaded filename. | | `mime_type` | string | e.g. `image/jpeg`, `video/mp4`. | | `size_bytes` | integer | File size. | | `cdn_url` | string | Public URL of the file. | | `width` / `height` | integer\|null | Pixel dimensions for images. | | `duration` | number\|null | Seconds, for video and audio. `null` means it was never measured, not zero. | | `sha256` | string\|null | Checksum of the stored bytes. Use it to verify a local copy without re-downloading. | | `folder` | string\|null | Optional organizational folder. | | `tags` | string[] | Optional tags. | | `alt_text` | string\|null | Accessibility text. | --- ## Upload media ``` POST /api/media ``` Send as `multipart/form-data`. | Field | Type | Required | Notes | | ---------- | -------- | -------- | -------------------------------------------------------------- | | `file` | file | yes | `jpg`, `jpeg`, `png`, `gif`, `webp`, `mp4`, `mov`, `webm`, `m4v`, `mp3`, `wav`, `m4a`, `aac`, `pdf`. Max 90 MB — use the resumable flow above that. | | `folder` | string | no | Organizational folder. | | `tags` | string[] | no | Each tag ≤ 50 characters. | | `alt_text` | string | no | ≤ 500 characters. | ```bash curl -X POST https://schedulenchill.com/api/media \ -H "Authorization: Bearer YOUR_API_KEY" \ -H "Accept: application/json" \ -F "file=@./launch.png" \ -F "folder=product-launch" \ -F "tags[]=launch" \ -F "alt_text=Product launch screenshot" ``` Returns `201 Created` with the media object. Use its `id` in a post's `media_ids`. > Building over MCP or from a server with a public file URL? Use the `upload_media` tool, which ingests media by URL instead of multipart upload. --- ## Upload a video from your own computer The single-request upload above is capped, and a large video in one request is fragile — one dropped connection and you start over. For anything big, open a **resumable session** and stream the file in chunks. Nothing is capped by request size, and an interrupted upload picks up where it stopped. This is what your AI tool does when you say *"upload `~/Videos/demo.mp4` and schedule it"* — the MCP `upload_media` tool with `source="local"` returns exactly the envelope below. ### 1. Open a session ``` POST /api/media/uploads ``` | Field | Type | Required | Notes | | ------------ | ------- | -------- | ---------------------------------------------------- | | `filename` | string | yes | Original name, with extension. | | `mime_type` | string | yes | e.g. `video/mp4`. | | `size_bytes` | integer | yes | Exact size. Finalize rejects a mismatch. | | `sha256` | string | no | Hex digest. When given, finalize verifies against it. | | `folder` | string | no | Carried onto the finished library item. | | `tags` | string[]| no | Carried onto the finished library item. | | `alt_text` | string | no | Carried onto the finished library item. Set it here — a large upload that lands undescribed almost never gets one added later. | A free account may upload up to **400 MB per file**; the absolute cap is 1 GB. Going over fails at session-open with a 422 that names the limit, so nothing is streamed for nothing. `GET /api/capabilities` reports *your* ceiling in `limits.max_upload_bytes` — read it rather than assuming. ```bash curl -X POST https://schedulenchill.com/api/media/uploads \ -H "Authorization: Bearer YOUR_API_KEY" \ -H "Content-Type: application/json" \ -H "Accept: application/json" \ -d '{"filename":"demo.mp4","mime_type":"video/mp4","size_bytes":11402, "sha256":"86e39c5a..."}' ``` ```json { "upload_id": "779b36fd-6d13-4c42-b3e5-c731956b093c", "chunk_size": 8388608, "received_bytes": 0, "size_bytes": 11402, "expires_at": "2026-08-04T07:35:44+00:00" } ``` ### 2. Stream the chunks `PATCH` each `chunk_size`-byte slice as a **raw** body — not multipart — with `offset` set to the running byte count (`0`, `chunk_size`, `2 × chunk_size`, …). ```bash curl -X PATCH "https://schedulenchill.com/api/media/uploads/UPLOAD_ID?offset=0" \ -H "Authorization: Bearer YOUR_API_KEY" \ -H "Content-Type: application/octet-stream" \ --data-binary @./chunk-0 ``` ```json { "received_bytes": 11402, "size_bytes": 11402, "completed": true } ``` **Send chunks one at a time, in order.** Parallel `PATCH`es corrupt the assembled file. If a chunk fails, re-`GET` the session to read `received_bytes` and resume from there — that number is the source of truth, not your own bookkeeping. ### 3. Finalize ```bash curl -X POST https://schedulenchill.com/api/media/uploads/UPLOAD_ID/complete \ -H "Authorization: Bearer YOUR_API_KEY" \ -H "Accept: application/json" ``` Returns the media object. Its `id` goes in a post's `media_ids`. ```json { "id": 12, "original_name": "demo.mp4", "mime_type": "video/mp4", "size_bytes": 11402 } ``` ### Notes - Use a token with `*` abilities (the default). A restricted token 401s on the chunk `PATCH`es. - `/mcp` and `/api/*` share one auth guard, so the same bearer works for both. - Sessions expire — `expires_at` is in the envelope. Abandoned ones are pruned. - `DELETE /api/media/uploads/{id}` cancels a session you no longer want. --- ## List media ``` GET /api/media ``` Paginated, 15 per page. Optional filters: | Query param | Description | | ----------- | ------------------- | | `search` | Match filename, alt text or tags. | | `type` | `image` or `video`. | | `folder` | Filter by folder. | | `tags` | Filter by tag. | | `per_page` | Rows per page, 1–200. Over 200 returns 422. | `page` | Page number. | --- ## Retrieve media ``` GET /api/media/{id} ``` --- ## Update media ``` PUT /api/media/{id} ``` Update metadata only — `folder`, `tags`, `alt_text`. The file itself is immutable; upload a new file to replace it. --- ## Delete media ``` DELETE /api/media/{id} ``` Returns `204 No Content`. --- Source: https://schedulenchill.com/docs/rest-api/api-keys # API Keys Manage your API keys over the API. Keys authenticate both the REST API and the MCP server — see [Authentication](/docs/authentication). ## List keys ``` GET /api/api-keys ``` Returns your keys with a masked preview (the secret is never returned again after creation): ```json [ { "id": "1234567890abcdef", "name": "Production Server", "key_preview": "••••••••abcdef", "last_used_at": "2026-06-06T12:30:00Z", "created_at": "2026-06-05T10:00:00Z" } ] ``` --- ## Create a key ``` POST /api/api-keys ``` | Field | Type | Required | Notes | | ------ | ------ | -------- | ------------------------------------------------ | | `name` | string | yes | A label to identify the key. Max 255 characters. | ```bash curl -X POST https://schedulenchill.com/api/api-keys \ -H "Authorization: Bearer YOUR_API_KEY" \ -H "Content-Type: application/json" \ -H "Accept: application/json" \ -d '{ "name": "CI pipeline" }' ``` Returns `201 Created`. The full `token` is included **only in this response** — store it securely, it cannot be retrieved again: ```json { "id": "abc123", "name": "CI pipeline", "token": "abc123|long-secret-string-shown-once", "created_at": "2026-06-06T17:40:00Z" } ``` --- ## Revoke a key ``` DELETE /api/api-keys/{id} ``` Immediately invalidates the key. Returns `204 No Content`. Any request using a revoked key returns `401`. --- Source: https://schedulenchill.com/docs/mcp # MCP Server Schedule & Chill ships a native [Model Context Protocol](https://modelcontextprotocol.io) server, so AI tools — Claude Code, Claude Desktop, Cursor, Gemini CLI, or your own agent — can schedule posts, upload video from your machine, and read your queue as first-class tools. No glue code: the agent calls tools directly. ## Two ways to connect There are two endpoints. They expose exactly the same tools, resources and prompts — only the way you sign in differs. | | Endpoint | Sign in with | Use it when | | --- | --- | --- | --- | | **Connect with a link** (recommended) | `https://schedulenchill.com/mcp-oauth` | OAuth 2.1 — you approve a consent screen in your browser | Your tool has an "Add connector" or "Add MCP server" button: Claude, ChatGPT, Cursor, VS Code, Zapier | | **Connect with an API key** | `https://schedulenchill.com/mcp` | A bearer token you paste into a config file | Your tool wants a static header, or you are scripting it | ### Connect with a link (recommended) Paste this URL into your AI tool and approve the screen it shows you: ``` https://schedulenchill.com/mcp-oauth ``` There is no key to create, copy, or store. Your tool discovers everything it needs from the URL, sends you to a Schedule & Chill consent screen that names the tool and lists what it is asking for, and gets its own token once you approve. Each tool is approved separately and can be revoked on its own. Your password is never shared. ### Connect with an API key ``` https://schedulenchill.com/mcp ``` Send the key as a bearer token on every request: ``` Authorization: Bearer YOUR_API_KEY ``` Create a key under **Settings → API Keys** (see [Authentication](/docs/authentication)). ## What it exposes | Kind | Items | | -------------------------------------------- | ------------------------------------------------------------------------------------------------------------- | | [Tools](/docs/mcp/tools) | 22 in total — `schedule_post`, `update_post`, `get_post`, `list_posts`, `cancel_post`, `publish_now`, `retry_post`, `duplicate_post`, `delete_post`, `restore_post`, `get_accounts`, `get_groups`, `get_capabilities`, `get_queue_slots`, `browse_media`, `upload_media`, `update_media`, `get_stats`, `get_analytics` and more | | [Resources](/docs/mcp/resources-and-prompts) | Connected Accounts, Upcoming Schedule, Media Library, Get Started | | [Prompts](/docs/mcp/resources-and-prompts) | `content_idea`, `draft_post` | ## Connecting **[Connect Your AI Tool](/docs/mcp/connect)** has copy-paste setup for Claude Code, Claude Desktop, Cursor, VS Code, Gemini CLI, Codex, Windsurf, Zed, Kimi CLI, OpenClaw, Hermes, and any other MCP client. The short version — Claude Code, one command, no key: ```bash claude mcp add --transport http schedulenchill https://schedulenchill.com/mcp-oauth ``` Then run `/mcp` and approve it in the browser window that opens. In **Claude**, **ChatGPT** or **Zapier**, add a custom connector and paste `https://schedulenchill.com/mcp-oauth` — there is nothing else to fill in. Clients that speak stdio only (Claude Desktop, Codex, Zed) still need the `mcp-remote` bridge rather than a plain URL — the setup guide covers each one. ## A typical agent flow 1. Call `get_accounts` to discover where it can post. 2. Optionally `browse_media` (or `upload_media` from a URL) to attach visuals. 3. Call `schedule_post` with content, platforms, and an optional time. 4. Confirm with `list_scheduled`, or `cancel_post` to undo. See [Tools](/docs/mcp/tools) for full parameters. --- Source: https://schedulenchill.com/docs/mcp/connect Schedule & Chill is a **remote MCP server**. Point your AI tool at one URL and it can schedule posts, upload video from your machine, and read your queue. ## Start here: connect with a link Most people should use this. Paste this URL into your AI tool: ``` https://schedulenchill.com/mcp-oauth ``` There is no key to create and nothing to paste into a config file. Your tool sends you to a Schedule & Chill consent screen that names the tool and lists what it is asking for. Approve it once and the tool holds its own token from then on. It works anywhere there is an **Add connector** or **Add MCP server** button — Claude, ChatGPT, Cursor, VS Code, Zapier. Each tool is approved separately, revoking one leaves the others alone, and your password is never shared. ## Or connect with an API key Some clients want a static header instead, and scripts usually do. That endpoint is: ``` https://schedulenchill.com/mcp ``` ``` Authorization: Bearer YOUR_API_KEY ``` Create a key under **Settings → API Keys**. Use a token with `*` abilities (the default) — a restricted token will 401 on media uploads. Both endpoints expose exactly the same 22 tools, 4 resources and 2 prompts. Nothing is missing from either one; only the sign-in differs. ## One click for Cursor and VS Code Open **Connect AI Tool** in your account, create a key, and press **Add to Cursor** or **Add to VS Code**. Your editor opens a confirmation dialog with the server already filled in — nothing is written until you approve it. ## Two connection patterns Every MCP client falls into one of two camps. Find yours below, or match the pattern. **Pattern A — native remote HTTP.** The client accepts a URL, and either runs the OAuth flow for you or lets you set custom headers. Nothing to install. **Pattern B — stdio bridge.** The client only speaks stdio to a local process. Use `mcp-remote`, which bridges stdio to a remote HTTP MCP server. It handles OAuth on its own if you give it the connector URL: ``` npx -y mcp-remote https://schedulenchill.com/mcp-oauth ``` or carries a static key if you prefer: ``` npx -y mcp-remote https://schedulenchill.com/mcp --header "Authorization: Bearer YOUR_API_KEY" ``` Requires Node.js 18+. Nothing to install ahead of time — `npx` fetches it. --- ## Claude Code Pattern A. One command, no key: ```bash claude mcp add --transport http schedulenchill https://schedulenchill.com/mcp-oauth ``` Then run `/mcp`, pick `schedulenchill`, and approve it in the browser window that opens. `claude mcp list` shows *Needs authentication* until you do. Prefer a key? Same command with the other endpoint and a header: ```bash claude mcp add --transport http schedulenchill https://schedulenchill.com/mcp \ --header "Authorization: Bearer YOUR_API_KEY" ``` Then in any session: *"Schedule a LinkedIn post for Tuesday 9am about our launch."* Check it registered with `claude mcp list`. Add `--scope project` to commit the server to a repo's `.mcp.json` and share it with your team (put the key in an env var first — do not commit it). ## Claude Desktop Claude Desktop's remote connectors expect OAuth, and this server now speaks it. Add it under **Settings → Connectors → Add custom connector** and paste `https://schedulenchill.com/mcp-oauth` — no config file, no key. The bridge below is still there if you would rather authenticate with an API key. Edit `claude_desktop_config.json` (**Settings → Developer → Edit Config**): ```json { "mcpServers": { "schedulenchill": { "command": "npx", "args": [ "-y", "mcp-remote", "https://schedulenchill.com/mcp", "--header", "Authorization: Bearer YOUR_API_KEY" ] } } } ``` Restart Claude Desktop fully (quit, don't just close the window). The tools appear under the connectors icon. ## Cursor **One click:** press **Add to Cursor** on the Connect AI Tool page in your account. Prefer to do it by hand? Create `.cursor/mcp.json` in your project, or `~/.cursor/mcp.json` for every project: ```json { "mcpServers": { "schedulenchill": { "url": "https://schedulenchill.com/mcp", "headers": { "Authorization": "Bearer YOUR_API_KEY" } } } } ``` Enable it under **Settings → MCP**. ## VS Code (GitHub Copilot agent mode) **One click:** press **Add to VS Code** on the Connect AI Tool page in your account. By hand — create `.mcp.json` in your workspace: ```json { "servers": { "schedulenchill": { "type": "http", "url": "https://schedulenchill.com/mcp", "headers": { "Authorization": "Bearer YOUR_API_KEY" } } } } ``` Open Chat, switch to **Agent** mode, and the tools appear in the tools picker. ## Gemini CLI Pattern A. Edit `~/.gemini/settings.json`: ```json { "mcpServers": { "schedulenchill": { "httpUrl": "https://schedulenchill.com/mcp", "headers": { "Authorization": "Bearer YOUR_API_KEY" } } } } ``` Verify with `/mcp` inside the CLI. ## Codex CLI Pattern B is the reliable route. Edit `~/.codex/config.toml`: ```toml [mcp_servers.schedulenchill] command = "npx" args = [ "-y", "mcp-remote", "https://schedulenchill.com/mcp", "--header", "Authorization: Bearer YOUR_API_KEY", ] ``` Recent Codex builds can talk to streamable-HTTP servers directly, but that path has moved around between releases. The bridge works on every version. ## Windsurf Pattern A. Edit `~/.codeium/windsurf/mcp_config.json`: ```json { "mcpServers": { "schedulenchill": { "serverUrl": "https://schedulenchill.com/mcp", "headers": { "Authorization": "Bearer YOUR_API_KEY" } } } } ``` ## Zed Pattern B, via Zed's context servers. In `settings.json`: ```json { "context_servers": { "schedulenchill": { "command": { "path": "npx", "args": [ "-y", "mcp-remote", "https://schedulenchill.com/mcp", "--header", "Authorization: Bearer YOUR_API_KEY" ] } } } } ``` ## Kimi CLI Pattern A. Edit `~/.kimi/mcp.json` — the format is deliberately Claude-Desktop-compatible: ```json { "mcpServers": { "schedulenchill": { "url": "https://schedulenchill.com/mcp", "headers": { "Authorization": "Bearer YOUR_API_KEY" } } } } ``` Manage servers with `kimi mcp` (add, list, remove), or point at a specific file with `kimi --mcp-config-file /path/to/mcp.json`. ## OpenClaw Pattern A. One command: ```bash openclaw mcp add schedulenchill \ --url https://schedulenchill.com/mcp \ --transport streamable-http \ --header "Authorization: Bearer YOUR_API_KEY" ``` Or edit `~/.openclaw/openclaw.json` directly — note servers live under `mcp.servers`, not a top-level `mcpServers`: ```json { "mcp": { "servers": { "schedulenchill": { "url": "https://schedulenchill.com/mcp", "transport": "streamable-http", "headers": { "Authorization": "Bearer YOUR_API_KEY" } } } } } ``` Check it with `openclaw mcp doctor schedulenchill --probe`. OpenClaw expands `${ENV_VAR}` in config, so put the key in an env var rather than committing it. ## Hermes Pattern A, YAML. Edit `~/.hermes/config.yaml` and add a top-level `mcp_servers` key: ```yaml mcp_servers: schedulenchill: url: "https://schedulenchill.com/mcp" headers: Authorization: "Bearer ${SCHEDULENCHILL_KEY}" ``` Then `hermes mcp test schedulenchill`, pick tools with `hermes mcp configure schedulenchill`, and reload with `/reload-mcp` (or restart the gateway). ## ChatGPT Supported, over OAuth. Use the connector URL, not the API-key endpoint: ``` https://schedulenchill.com/mcp-oauth ``` **Settings → Connectors → Add**, paste the URL, and approve the consent screen. There is no header or key field to fill in — ChatGPT registers itself and gets its own token. Adding a custom connector needs a paid ChatGPT plan with developer mode enabled. If you do not have that, any ChatGPT surface that can call an HTTP API can use the [REST API](/docs/rest-api) with a key instead. ## Any other MCP client This covers n8n, LangChain, CrewAI, LibreChat, custom agents, and anything else that speaks MCP. Ask one question: **can it take a remote MCP URL with custom headers?** - **Yes** → Pattern A. URL `https://schedulenchill.com/mcp`, header `Authorization: Bearer YOUR_API_KEY`. The exact JSON key differs per client (`url`, `httpUrl`, `serverUrl`), so copy the shape its own docs use. - **No, stdio only** → Pattern B with the `npx mcp-remote` command above. From your own code, use any MCP client library with the same URL and header. The server speaks standard streamable HTTP MCP — there is nothing bespoke to implement. If your client isn't listed and you get it working, tell us and we'll add it. --- ## Verify the connection Ask your tool: *"List my connected social accounts."* It should call `get_accounts` and return your channels. If nothing happens, work through these in order: | Symptom | Cause | Fix | |---|---|---| | Tools don't appear at all | Client not restarted | Fully quit and reopen — most clients read MCP config only at startup | | `401 Unauthorized` | Key wrong, expired, or revoked | Generate a fresh key in **Settings → API Keys** | | `401` only on media upload | Token lacks `*` abilities | Create a new key with default (`*`) abilities | | `platform_unavailable` | Targeting a platform not open on your account | Call `get_accounts` first — post only to what it returns | | `429 Too Many Requests` | Rate limit | 60 requests/min on MCP. Back off and retry after `Retry-After` | | Bridge errors mentioning `npx` | Node.js missing or too old | Install Node.js 18+ | ## First things to try Start with this one. It reads before it writes, so you can confirm the connection works without publishing anything: > Using Schedule & Chill, list my connected social accounts. Then write a short LinkedIn > post about what I shipped this week and schedule it for 5 minutes from now — show me > the draft first so I can approve it. Five minutes, not next week — the point of the first run is watching it actually publish. Then, in plain language: - *"List my connected social accounts."* - *"Draft a LinkedIn post about shipping our free tier and schedule it for 10 minutes from now."* - *"Upload `~/Videos/demo.mp4` and schedule it to LinkedIn tomorrow morning."* - *"What's in my posting queue this week?"* - *"Cancel the post scheduled for Friday."* Uploading a video from your own machine works even for large files — see [Uploading video from your computer](/docs/rest-api/media). Your AI tool streams it in chunks rather than posting one huge request, so there's no size cliff. ## What your AI tool can do Full parameters in [Tools](/docs/mcp/tools). | Tool | What it does | |---|---| | `get_accounts` | List connected channels. **Always call this first.** | | `get_groups` | List saved channel groups | | `schedule_post` | Schedule or publish immediately | | `update_post` | Edit a draft or scheduled post | | `get_post` | Read one post and its per-channel status | | `list_scheduled` | See the queue | | `cancel_post` | Remove a scheduled post | | `upload_media` | Upload from a URL, or stream a local file of any size | | `browse_media` | Search the media library | | `get_stats` | Posting stats | --- Source: https://schedulenchill.com/docs/mcp/tools # MCP Tools The MCP server exposes nineteen tools. All operate on the account tied to your API key. Removing a post is reversible — `cancel_post` and `delete_post` soft-delete, and `restore_post` brings it back. Publishing is not: `publish_now` and `retry_post` send immediately. ## schedule_post Create a post for one or more connected platforms. `when` is **required and has no default** — omitting it is an error, not an instruction to publish. Publishing is irreversible, so it is never what you get by leaving a field out. | Parameter | Type | Required | Notes | | -------------- | --------- | -------- | -------------------------------------------------------------------------------------------------------------------------------- | | `content` | string | yes | Post text, ≤ 10,000 characters. | | `when` | string | **yes** | `"draft"` (saves only — publishes nothing, exempt from the monthly limit), `"now"` (immediate, irreversible), `"next_slot"`, or a future ISO-8601 timestamp. | | `platforms` | string[] | yes | One or more of `x`, `linkedin`, `linkedin_page`, `facebook`, `instagram`, `pinterest`, `youtube`, `tiktok`, `bluesky`, `mastodon`. | | `media_ids` | integer[] | no | Media library ids to attach. | | `scheduled_at` | string | no | **Deprecated**, accepted for one more release — same as passing the timestamp in `when`, and ignored when `when` is given. | Returns the new `post_id`, `status`, `platforms`, and `scheduled_at`. Targeting can also be done by `account_ids` or `group_ids` instead of `platforms` — the three are mutually exclusive. Per-account caption overrides go in `platform_content`, and platform-native fields in `platform_options`. ## update_post Change a draft or scheduled post: its content, schedule, target channels, attached media, per-account captions, or platform options. Only the fields you pass are changed. | Parameter | Type | Required | Notes | | ------------------ | --------- | -------- | ------------------------------------------------------------------ | | `post_id` | integer | yes | Id of the draft or scheduled post. | | `content` | string | no | New shared text. | | `scheduled_at` | string | no | New publish time, ISO 8601. | | `account_ids` | integer[] | no | Retarget. Mutually exclusive with `group_ids` and `platforms`. | | `media_ids` | integer[] | no | Replace the attached media. | | `platform_content` | object[] | no | Per-account caption overrides. | | `platform_options` | object[] | no | Per-account native settings, e.g. YouTube `{title, privacy}`. | ## get_post Fetch one post: its status, derived outcome, and per-channel publish result including the error message for any channel that failed. Also finds cancelled and deleted posts, which come back with a `deleted_at` and an outcome of `deleted`. | Parameter | Type | Required | Notes | | --------- | ------- | -------- | --------------- | | `post_id` | integer | yes | Id of the post. | ## get_accounts List all connected social accounts and their status. No parameters. Returns each account's `id`, `platform`, `account_name`, `username`, and `is_active`. ## get_groups List your channel groups and the account ids each contains. No parameters. Use a `group_id` from here to target a whole group with `schedule_post` or `update_post`. ## get_capabilities The MCP twin of `GET /api/capabilities`, for agents that only have this server configured. Returns which platforms are live for you, the exact `platform_options` schema each accepts (key, type, allowed values, default), per-platform media rules, and upload size limits. | Parameter | Type | Required | Notes | | ---------- | ------ | -------- | -------------------------------------------------------- | | `platform` | string | no | Limit to one platform. Omit for everything available. | **Call this before passing `platform_options`.** An option key outside the schema is dropped silently and the call still returns success — so a guessed key publishes the default instead of what you asked for. A platform with no native options comes back as an explicit `{}`, never a missing key. ## get_queue_slots The next open slots in the posting schedule, so you can offer a human real times ("Tue 9:00 AM or Wed 1:00 PM?") before writing anything. Read-only — it reserves nothing. Pair it with `when: "next_slot"` on `schedule_post`. | Parameter | Type | Required | Notes | | --------- | ------- | -------- | ------------------------- | | `count` | integer | no | How many slots to return. | ## list_posts List posts, newest-scheduled first. Defaults to `status="scheduled"` — the upcoming queue. | Parameter | Type | Required | Notes | | --------- | ------- | -------- | -------------------------------------------------------------------- | | `status` | string | no | `scheduled` (default), `draft`, `published`, `failed`, or `all`. | | `limit` | integer | no | Default 10, max 50. | Use `status="draft"` to find posts created with `schedule_post` `when="draft"` — they do not appear in the default queue view. ## list_scheduled List upcoming scheduled posts. `list_posts` supersedes this and can filter by status. | Parameter | Type | Required | Notes | | --------- | ------- | -------- | ------------------- | | `limit` | integer | no | Default 10, max 50. | ## publish_now Publish an existing draft, scheduled or failed post immediately. Returns straight away — publishing runs in the background, so call `get_post` afterwards for the per-channel outcome. | Parameter | Type | Required | Notes | | --------- | ------- | -------- | ------------------------------------------- | | `post_id` | integer | yes | Id of a draft, scheduled or failed post. | ## retry_post Retry only the channels that failed, leaving channels that already published untouched. Works on a partial outcome too — a post can be `published` overall while one channel failed. | Parameter | Type | Required | Notes | | --------- | ------- | -------- | -------------------------------------- | | `post_id` | integer | yes | Id of a post with one or more failures. | ## duplicate_post Copy a post's content, first comment, channels and media into a **new draft**. Nothing is scheduled or sent. Channels disconnected since the original was written are dropped from the copy and reported in `dropped_account_ids`. | Parameter | Type | Required | Notes | | --------- | ------- | -------- | ----------------- | | `post_id` | integer | yes | Id of the source. | ## cancel_post Cancel a scheduled post before it publishes. Only posts in the `scheduled` state can be cancelled — use `delete_post` for any other state. Soft delete: recoverable with `restore_post`. | Parameter | Type | Required | Notes | | --------- | ------- | -------- | ------------------------- | | `post_id` | integer | yes | Id of the scheduled post. | ## delete_post Delete a post in any state. Soft delete, so `restore_post` undoes it, and a deleted post never publishes. Deleting a post that already published does **not** remove it from the social platform — only from Schedule & Chill. | Parameter | Type | Required | Notes | | --------- | ------- | -------- | --------------- | | `post_id` | integer | yes | Id of the post. | ## restore_post Restore a post removed by `delete_post` or `cancel_post`. A post whose scheduled time has already passed is restored as a **draft** rather than re-armed, so restoring never publishes anything by itself. | Parameter | Type | Required | Notes | | --------- | ------- | -------- | ----------------------- | | `post_id` | integer | yes | Id of the deleted post. | ## get_stats Return posting statistics: total, published, scheduled, draft, and failed post counts, plus media and connected-account totals. No parameters. ## get_analytics Engagement analytics for published posts over a date window: reach, impressions, likes/comments/shares, engagement rate, per-channel and per-platform breakdowns, a daily timeline, and top posts. Defaults to the last 7 days in your own timezone. | Parameter | Type | Required | Notes | | ----------------- | --------- | -------- | ----------------------------------------------------------------- | | `from` | string | no | `YYYY-MM-DD` in your timezone. Default 7 days ago. | | `to` | string | no | `YYYY-MM-DD` in your timezone. Default today. | | `account_ids` | integer[] | no | Limit to these channels. Omit for all, including disconnected. | | `group_id` | integer | no | Limit to a channel group. Ignored when `account_ids` is given. | | `top_posts_limit` | integer | no | Default 5, max 20. | Metrics are collected on a schedule after a post goes out, so a post published minutes ago has none yet. When that happens the response carries a `note` saying so, rather than letting a fresh post read as zero engagement. ## browse_media Search and browse the media library. Returns media items with `id`s you can attach to `schedule_post`. `search` matches the filename, the description (`alt_text`) **and** the tags — so a clip described as "cable crossover at the gym" is found by `gym` even though its filename is `PXL_20260806_113344.mp4`. | Parameter | Type | Required | Notes | | -------------- | -------- | -------- | ------------------------------------------------------------------------ | | `search` | string | no | Matches filename, `alt_text` and tags. | | `type` | string | no | `image`, `video`, `audio` or `document`. | | `folder` | string | no | Filter by folder. | | `tags` | string[] | no | Every tag must be present, e.g. `["lane:bhai","stage:final"]`. | | `min_duration` | integer | no | Seconds. Items with an unmeasured duration are excluded, not treated as zero. | | `max_duration` | integer | no | Seconds. | | `limit` | integer | no | Default 10, max 50. | | `offset` | integer | no | Skip this many, for paging. | Results carry `alt_text`, `duration` and `sha256` alongside the URL, which is what lets you tell two clips apart without downloading them. `total` reports how many matched before `limit` was applied. ## list_asset_vocabulary Lists the folders and tags actually in use, with counts, plus how many items are untagged. Takes no parameters. Call it before `browse_media` and before `update_media`: a guessed tag returns an empty result rather than an error, which reads as "there is no such footage" when the footage is there under a different name. ## update_media Set the description, tags or folder on a library item. This is how an asset becomes findable. | Parameter | Type | Required | Notes | | ---------- | -------- | -------- | ---------------------------------------------------------------------------- | | `media_id` | integer | yes | From `browse_media` or `upload_media`. | | `alt_text` | string | no | Human description. Pass `""` to clear. | | `tags` | string[] | no | **Replaces** the whole list, it is not merged. Pass `[]` to clear. | | `folder` | string | no | Pass `""` to clear. | Only fields you send are changed; omitting one leaves it alone. Tags are lower-cased and de-duplicated so the vocabulary cannot fork on casing. ## upload_media Add a media file to the library. Returns a `media_id` to attach to posts. Two modes via `source`: `url` (default) downloads from a public URL; `local` opens a resumable chunked session for a file on your machine, with no size cap. `folder`, `tags` and `alt_text` apply to **both** modes. | Parameter | Type | Required | Notes | | ------------ | -------- | ----------------- | -------------------------------------------------------------- | | `source` | string | no | `url` (default) or `local`. | | `url` | string | url mode | Public URL of the file. | | `filename` | string | yes | Original filename with extension, e.g. `launch.png`. | | `mime_type` | string | local mode | e.g. `video/mp4`. | | `size_bytes` | integer | local mode | Exact size in bytes. | | `sha256` | string | no | Verified at finalize when given. | | `folder` | string | no | Folder to organize the media. | | `tags` | string[] | no | e.g. `["lane:bhai","stage:final"]`. | | `alt_text` | string | no | Description. Set it here — it is what makes the asset findable later. | Audio (`mp3`, `wav`, `m4a`, `aac`) is accepted as a production input and can never be attached to a post. --- Source: https://schedulenchill.com/docs/mcp/resources-and-prompts # Resources & Prompts Beyond tools, the MCP server exposes read-only **resources** (context an agent can load) and **prompts** (ready-made templates). ## Resources Resources are read-only JSON an agent can pull into context without making a change. | Resource | URI | Contents | | ------------------ | ------------------------------------- | --------------------------------------------------------- | | Connected Accounts | `schedulenchill://accounts/connected` | Active connected accounts (id, platform, name, username). | | Upcoming Schedule | `schedulenchill://schedule/upcoming` | The next 20 scheduled posts. | | Media Library | `schedulenchill://media/library` | The 20 most recent media files. | Example — the Upcoming Schedule resource: ```json { "count": 5, "posts": [ { "id": 123, "content": "Hello world…", "scheduled_at": "2026-06-07T10:00:00Z", "platforms": ["x", "linkedin"] } ] } ``` ## Prompts Prompts are reusable templates an MCP client can offer the user. ### content_idea Generate content ideas for a niche. | Argument | Required | Notes | | -------- | -------- | ---------------------------- | | `niche` | yes | Your niche or industry. | | `count` | no | Number of ideas (default 5). | ### draft_post Draft a post about a topic, sized for the target platforms. | Argument | Required | Notes | | ----------- | -------- | ------------------------------------------------------------------------------------------------------ | | `topic` | yes | Subject of the post. | | `tone` | no | `professional`, `casual`, or `humorous`. Defaults to professional. | | `platforms` | no | Comma-separated targets, e.g. `x,linkedin`. Affects length and style (X ≤ 280 chars; LinkedIn longer). | A typical flow: call `draft_post` to write copy, then `schedule_post` to queue it. --- Source: https://schedulenchill.com/docs/reference/platforms # Supported Platforms Use these identifiers in the REST API (`social_account_ids` reference accounts on these platforms) and in the MCP `schedule_post` tool's `platforms` array. | Platform | Identifier | | ------------------ | --------------- | | X (Twitter) | `x` | | LinkedIn (profile) | `linkedin` | | LinkedIn (Page) | `linkedin_page` | | Facebook | `facebook` | | Instagram | `instagram` | | Pinterest | `pinterest` | | YouTube | `youtube` | | TikTok | `tiktok` | | Bluesky | `bluesky` | | Mastodon | `mastodon` | ## Platform notes - **X** posts are limited to 280 characters; longer `content` may be rejected by the platform. Tailor text with `platform_content` (REST) when posting the same idea to X and longer-form networks. - **LinkedIn** distinguishes personal profiles (`linkedin`) from company **Pages** (`linkedin_page`) — connect and target them separately. - Image and video support varies by platform. Attach media via `media_ids`. ## Coming soon Threads and Google Business Profile are on the roadmap. Track additions in the [Changelog](/docs/reference/changelog). --- Source: https://schedulenchill.com/docs/reference/errors # Errors & Status Codes The API uses conventional HTTP status codes and returns JSON error bodies. Always send `Accept: application/json` so errors come back as JSON. ## Status codes | Code | Meaning | | -------------------------- | ------------------------------------------------------------------------------- | | `200 OK` | Successful `GET` or `PUT`. | | `201 Created` | Resource created (`POST`). | | `204 No Content` | Successful `DELETE`. | | `401 Unauthorized` | Missing or invalid API key. | | `403 Forbidden` | Authenticated, but not allowed to access this resource. | | `404 Not Found` | Resource does not exist. | | `422 Unprocessable Entity` | Validation failed, or the action isn't allowed in the resource's current state. | ## Validation errors A `422` returns a `message` and a field-keyed `errors` object: ```json { "message": "The content field is required.", "errors": { "content": ["The content field is required."], "scheduled_at": ["The scheduled at must be a date after now."] } } ``` ## State errors Some actions are only valid in certain states — for example, only `draft` and `scheduled` posts can be updated. These also return `422` with a plain `message`: ```json { "message": "Only draft and scheduled posts can be updated" } ``` ## Handling errors - Treat any `4xx` as a client-side issue to fix (bad input, wrong id, missing auth). - Inspect `errors` to surface field-level messages to your users. - Retry only on `5xx` / network failures, with backoff. --- Source: https://schedulenchill.com/docs/reference/rate-limits # Rate Limits We believe in being straight with developers about what's enforced today. ## Current state The REST API and MCP server do **not** apply a hard per-key request rate limit today. Authentication endpoints (sign-in, password reset) are throttled to 6 requests per minute. That said, design your integration to be a good citizen: - **Batch** where you can rather than firing one request per item in a tight loop. - **Back off** on `5xx` responses with exponential retry. - **Cache** account and media lists instead of re-fetching them on every operation. ## Coming soon Per-key rate limits with standard `X-RateLimit-*` response headers are planned. When introduced, exceeding the limit will return `429 Too Many Requests` with a `Retry-After` header. We'll announce the limits in the [Changelog](/docs/reference/changelog) before enforcing them, so integrations can adapt. ## Webhooks Outbound webhooks (publish/fail notifications) are not available yet — today you poll `GET /api/posts` (or the MCP `list_scheduled` tool) for status. Webhooks are on the roadmap. --- Source: https://schedulenchill.com/docs/reference/changelog # Changelog Notable changes to the public API and MCP server. Breaking changes will always be announced here first. ## 2026-09-01 - **The MCP server now speaks OAuth 2.1, at a second endpoint: `https://schedulenchill.com/mcp-oauth`.** Paste that URL into Claude, ChatGPT, Claude Desktop, Cursor, VS Code or Zapier as a custom connector and approve the consent screen — there is no API key to create, copy or store. It supports PKCE and dynamic client registration (RFC 7591), so a client configures itself from the URL alone. Tokens are scoped to `mcp:use`, issued per tool, and revocable individually. - **`https://schedulenchill.com/mcp` is unchanged and is not going away.** Both endpoints expose exactly the same 22 tools, 4 resources and 2 prompts; only the authentication differs. Every existing API-key configuration keeps working. - **ChatGPT connectors now work.** They authenticate with OAuth and have no field for a static bearer header, which is why the old bearer-only endpoint could not be used from ChatGPT. The docs previously said this was unsupported and on the roadmap; it has shipped. - **Fixed: tools failed over OAuth.** Any tool that touched a relation — `get_accounts` among them — returned `Call to undefined method OAuthUser::socialAccounts()`. The Passport guard resolves an identity-only model that is swapped for the real user by middleware, but the swap only reached `Illuminate\Http\Request::user()`, while MCP tools resolve through the auth manager. The handshake succeeded and every tool call failed. - **Fixed: a 401 from `/mcp-oauth` carried no `WWW-Authenticate` header.** RFC 9728 and the MCP authorization spec both require it, and strict clients use it to find the resource metadata. Without it a client could only report that the server does not support OAuth. ## 2026-08-07 - **Breaking (MCP `schedule_post`): timing is now an explicit, required `when`.** It takes `"draft"`, `"now"`, `"next_slot"`, or an ISO-8601 timestamp. Previously an **omitted** `scheduled_at` meant "publish immediately and irreversibly" — an absent parameter deciding to broadcast, on the surface driven by a model. Omitting both `when` and `scheduled_at` now returns `no_timing_specified` and publishes nothing. `scheduled_at` still works for **one more release** and is equivalent to passing that timestamp in `when` (ignored if `when` is also given; the response `warnings` say so). `when="draft"` creates a draft — no publish job is queued, and drafts do not count against the monthly post limit. `when="next_slot"` with no posting schedule returns `no_queue_slots` rather than falling through to publish-now. REST `POST /api/posts` is unchanged: it already required an explicit `publish_now` and defaulted to draft. - **New MCP tool `get_queue_slots`** — read-only; returns the next open slots in your posting schedule as `{iso, label}`. Slots are computed, not reserved, so use it to show a human real options; use `when="next_slot"` when you want the server to pick at write time. - **MCP `list_scheduled` renamed to `list_posts`**, with a new `status` filter (`scheduled` default, plus `draft`, `published`, `failed`, `all`) so agent-created drafts are findable. `list_scheduled` stays registered as a deprecated alias for one release and keeps its old scheduled-only behaviour. - **LinkedIn post visibility** — `platform_options` for `linkedin` now accepts `visibility`: `PUBLIC` (default) or `CONNECTIONS`. Discoverable via `get_capabilities` / `GET /api/capabilities`. - **Error envelopes rewritten for agents** — `plan_limit_reached`, `no_connected_accounts`, and `account_inactive` no longer end at "upgrade your plan" or "go to Settings", which a caller with no browser cannot do. Each now leads with an action the caller can take and carries structured recovery data: `alternatives[]` (healthy accounts with `health`), `resets_at`, `drafts_count_against_limit`, and `connect_url`/`reconnect_url`/`upgrade_url` for the human handoff. - **Six new MCP tools bring the agent surface level with the dashboard** — `publish_now` (send a draft, scheduled or failed post immediately), `retry_post` (resend only the channels that failed, leaving published ones untouched), `duplicate_post` (copy content, channels and media into a new draft), `delete_post` (remove a post in any state), `restore_post` (undo a delete or cancel), and `get_analytics` (reach, impressions, likes/comments/shares, engagement rate, per-channel and per-platform breakdowns, daily timeline and top posts over a date window). - **Removing a post is now reversible from an agent.** `cancel_post` and `delete_post` soft-delete, and `restore_post` brings the post back. `get_post` now also finds deleted posts, returning `deleted_at` and an `outcome` of `deleted` — previously a cancelled post vanished from every read surface. A post whose scheduled time has passed is restored as a **draft** rather than re-armed, so restoring never publishes anything by itself. - **New error codes**: `post_not_publishable`, `post_not_retryable`, `post_not_deleted`. - **A platform with no native options now returns `{}`, not a missing key** — on both `get_capabilities` and `GET /api/capabilities`. A missing key read as "unknown platform". - **REST gets the same verbs**: `POST /api/posts/{id}/cancel`, `/publish-now`, `/retry`, `/duplicate`, `/restore`, plus `GET /api/analytics`. Each mirrors the MCP tool of the same name; a test asserts `GET /api/analytics` and `get_analytics` return identical payloads. - **`DELETE /api/posts/{id}` on a scheduled post is no longer a dead end.** It told you to "cancel scheduled post before deleting" while no cancel endpoint existed, so a scheduled post could not be removed over REST at all. Cancel now exists. **Breaking:** that refusal changes from `422 {message}` to `409 {error: {code: 'post_not_cancelable', ...}}`, matching the error envelope every other endpoint uses. - **State-conflict errors now return 409, not 422** — `post_not_cancelable`, `post_not_publishable`, `post_not_retryable`, `post_not_deleted`. The request body is fine; the post is in a state that does not allow the action. ## 2026-07-17 - **Per-account `publishing` status** — while a post publishes, each targeted account's `pivot.status` transitions `pending → publishing → published | failed`. `publishing` is transient (a channel is uploading/processing). The post's own `status` stays `scheduled` throughout publishing; poll until no account is `pending` or `publishing`, then treat a `published` post that still has a `failed` account as a **partial** publish. `partial` is derived, not a stored `status`. - **New MCP tool `get_post`** — retrieve a single post by id with its post-level `status`, a derived `outcome` (`draft`/`scheduled`/`publishing`/`published`/`partial`/`failed`), and `per_account[]` delivery records (`status`, `error_message`, `platform_url`, `published_at`). Use it to poll a just-published post; `list_scheduled` now also includes per-account `status`, and `get_stats` reports a `publishing` count. ## 2026-06-07 - **Developer documentation launched** at `schedulenchill.com/docs` — REST API, MCP server, and reference. ## 2026-06 - **MCP server** available at `/mcp` with seven tools, three resources, and two prompts. - **REST API**: Posts, Media, and API Keys resources with bearer-token authentication. - **Platforms**: X, LinkedIn (profiles + Pages), Facebook, Instagram, Pinterest, YouTube, TikTok. ## Roadmap - Outbound webhooks for publish/fail events. - Per-key rate limits with `X-RateLimit-*` headers. - Additional platforms: Threads, Bluesky, Google Business Profile. - OpenAPI specification and official SDKs.