<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Deal Breaker</title>
    <description>The latest articles on DEV Community by Deal Breaker (@dealbreaker).</description>
    <link>https://dev.to/dealbreaker</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F209054%2F51943fb3-6bbb-4765-ba88-a5931ecb07bc.jpg</url>
      <title>DEV Community: Deal Breaker</title>
      <link>https://dev.to/dealbreaker</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/dealbreaker"/>
    <language>en</language>
    <item>
      <title>How to Grow on LinkedIn in 2026 Ultimate Guide</title>
      <dc:creator>Deal Breaker</dc:creator>
      <pubDate>Tue, 13 Oct 2026 10:44:11 +0000</pubDate>
      <link>https://dev.to/dealbreaker/how-to-grow-on-linkedin-in-2026-ultimate-guide-11m1</link>
      <guid>https://dev.to/dealbreaker/how-to-grow-on-linkedin-in-2026-ultimate-guide-11m1</guid>
      <description>&lt;p&gt;LinkedIn growth in 2026 is two games played at once — broadcast (followers via content) and 1:1 (connections via targeted requests). Win both by picking a narrow niche, optimizing your profile for discovery, posting 3-5x per week, and sending 20-50 relevant connection requests per week to people adjacent to your target audience, so you stay well under LinkedIn's rate limits.&lt;/p&gt;

&lt;h2&gt;
  
  
  Followers and connections are two different things on LinkedIn, and understanding the distinction is the first step to growing on LinkedIn intentionally.
&lt;/h2&gt;

&lt;p&gt;A connection is a two-way relationship — both people see each other's content and can message each other directly. A follower is one-way — they see your content in their feed, but you don't see theirs, and there's no DM channel unless they connect with you.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Connections max out at 30,000. Followers are unlimited.&lt;/li&gt;
&lt;li&gt;If you want more reach, chase followers. If you want more conversations (job leads, client DMs, warm intros), chase connections.&lt;/li&gt;
&lt;li&gt;If you're building a personal brand, becoming an industry voice, or trying to reach a big audience, followers are the metric. Switch your profile to "Follow" as the primary button (Settings → Visibility → Followers → toggle on "Make Follow primary").&lt;/li&gt;
&lt;li&gt;If you're in sales, job-hunting, or building a B2B network where individual relationships matter, keep "Connect" as primary.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Your profile is the landing page for every post you publish and every connection request you send.
&lt;/h2&gt;

&lt;p&gt;Before you chase growth, make sure the profile is actually ready to convert a visitor into a follower or connection. The goal isn't to look "polished" — it's to make your niche unmistakable in the first 3 seconds so the algorithm and humans both know what you do. A great profile answers three questions instantly: Who are you? What do you do? Who do you do it for?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Photo — clear headshot, face visible, professional but not stiff. Not your logo, not a vacation photo.&lt;/li&gt;
&lt;li&gt;Banner — this is free billboard space. Write who you help and what outcome you deliver. Make it readable on mobile.&lt;/li&gt;
&lt;li&gt;Headline — not your job title. A benefit-driven line: "I help B2B founders turn LinkedIn into a pipeline engine" beats "Founder at Acme Corp."&lt;/li&gt;
&lt;li&gt;About section — first 2 lines are what people see before clicking "see more." Hook them there. Then tell your story and list what you help with.&lt;/li&gt;
&lt;li&gt;Featured section — pin 3-4 best posts, a case study, or a link to your calendar/website. This is your proof.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The number one reason people stall on LinkedIn is not knowing what to post. The fix is content pillars: three to four recurring themes you write about over and over.
&lt;/h2&gt;

&lt;p&gt;A content pillar is a theme you return to often enough that people start to associate it with you. Pillars keep you consistent, train the algorithm to show your work to the right audience, and help followers know exactly what they get by sticking around.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Most strong LinkedIn creators run on three to four. Not one (too narrow, you run dry), not ten (too scattered, you teach your audience nothing).&lt;/li&gt;
&lt;li&gt;Posting across 15 random topics teaches the algorithm nothing and gives your audience no mental hook to file you under.&lt;/li&gt;
&lt;li&gt;Aim for a mix that includes practical how-to content, opinions and hot takes, and personal or story-driven posts, because variety keeps your feed from feeling like a lecture.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Documents (uploaded PDFs, slide decks, multi-page carousels) earn 7.00% average engagement because they maximize the two signals LinkedIn's algorithm weights most heavily: dwell time and saves.
&lt;/h2&gt;

&lt;p&gt;A 10-slide document holds a reader for 60 to 90 seconds; a text post holds them for 10 to 15. LinkedIn's LiRank model uses a "Long Dwell" binary classifier as a primary feed-ranking signal: posts that generate extended reading time are pushed to second- and third-degree connections; posts scrolled quickly stay local.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;According to Socialinsider's 2026 benchmarks (1.3M business posts), documents (PDF carousels) show the highest engagement rate (~7.0%), followed by multi-image posts (~6.5%) and native video (~6.0%), then single images (~5.3%) and text-only posts (~4.5%), with polls (~4.2%) and especially posts with external links (~3.3%) at the bottom.&lt;/li&gt;
&lt;li&gt;Documents, by requiring the reader to swipe through slides, mechanically extend dwell time beyond what any text post achieves.&lt;/li&gt;
&lt;li&gt;Document posts (carousels) should run 6–10 slides.&lt;/li&gt;
&lt;li&gt;Posts in the 1,300–2,000 character range tend to earn more dwell time — long enough to tell a story but short enough to finish.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Posting frequency matters, but not as much as most people think.
&lt;/h2&gt;

&lt;p&gt;For personal profiles, the sweet spot is 3-5 posts per week. Below that, the algorithm deprioritizes you. Above 5, quality usually drops and engagement thins out because your audience can't keep up.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Consistency matters more than frequency — 3 posts a week for 6 months beats 10 posts a week for 3 weeks followed by silence.&lt;/li&gt;
&lt;li&gt;The most common mistake is burning out after a sprint. Pick a cadence you can hold for 90 days and build from there.&lt;/li&gt;
&lt;li&gt;If you're starting out, commit to 3 posts a week — two tactical, one personal/story — and keep it going.&lt;/li&gt;
&lt;li&gt;Grow your audience in a sustainable way: 2 to 5 posts per week&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  When you comment on someone else's post — someone with 40,000 followers and a post that's already going viral — you're borrowing their distribution.
&lt;/h2&gt;

&lt;p&gt;A sharp comment on a post pulling 200,000 impressions can get seen by 5,000–15,000 people on its own, and the people seeing it are already engaged with your exact topic. They didn't have to find you. You showed up in the conversation they were already having.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Comment before you post. Spend 20–30 minutes commenting on five to ten posts before writing your own content for the day.&lt;/li&gt;
&lt;li&gt;Add something. Share an example, a counterpoint, or a lesson. "Great post" is invisible.&lt;/li&gt;
&lt;li&gt;Skip the pitch. Value first. The pitch, if any, comes much later and in private.&lt;/li&gt;
&lt;li&gt;Ten great comments beat thirty filler ones every time.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Every reply you give to a comment generates a new activity signal and can trigger a second wave of distribution.
&lt;/h2&gt;

&lt;p&gt;If you post and disappear, you waste half the potential. Reserve the first hour after posting to actively reply, with multi-word answers, not just "thanks!".&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Publishing and then going offline for three hours is the most common golden hour mistake.&lt;/li&gt;
&lt;li&gt;If you edit during the golden hour, you want to be fast and surgical. A five second fix to a typo will not hurt you.&lt;/li&gt;
&lt;li&gt;External links in the post itself often suppress reach because LinkedIn wants people to stay on the platform. If you must link, put it in the first comment, then write "link in the comments" in the post.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Warming up LinkedIn prospects before you connect, by reading their content, engaging genuinely with something specific to them, and writing a note that references that engagement, changes the conversion math considerably.
&lt;/h2&gt;

&lt;p&gt;The fix is not a better template. It is making sure you are not a stranger when the request arrives. For high-value accounts, it is worth doing carefully.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The "engage first, connect second" move: Comment thoughtfully on someone's post 2-3 times over a week before sending the request. Mention the comment in your note. Acceptance rates jump significantly when someone recognizes your name.&lt;/li&gt;
&lt;li&gt;Who to target: People who engaged with your last 5 posts — commented, reacted, or reshared. They already know you.&lt;/li&gt;
&lt;li&gt;People who engaged with posts in your niche from creators you follow. They're your audience — they just haven't met you yet.&lt;/li&gt;
&lt;li&gt;Who to avoid: Random 3rd-degree profiles with zero context. Low acceptance, high flagging risk.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The practical takeaway: you cannot grow by sending more, because the cap is fixed. You grow by raising the share that get accepted.
&lt;/h2&gt;

&lt;p&gt;Every account gets roughly 100 to 200 sent invitations per rolling week. The exact number depends on your account age, history, and how LinkedIn scores your behavior.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A 2025 study of 16,492 requests found the average acceptance rate is around 37%, and anything under 20% is a red flag that can get your account restricted.&lt;/li&gt;
&lt;li&gt;Most people should send 20-50 per week max — quality beats volume, and low acceptance rates trigger restrictions. Spread them across the week instead of sending 50 in one day.&lt;/li&gt;
&lt;li&gt;LinkedIn follows a rolling 7-day window, not a Monday-to-Sunday reset.&lt;/li&gt;
&lt;li&gt;Send at the cap every week and you are not growing faster; you are just spending your entire budget, often on people who never accept.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Your LinkedIn public profile is a streamlined version of your profile that shows up in search engine results, and is visible to people who aren't signed in to LinkedIn.
&lt;/h2&gt;

&lt;p&gt;You can promote your profile to show up better in search engine results by creating a personal URL. You can also create a badge for your public profile that you can add to your online resume, blog, or website from the Public profile settings page.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Once you've got a clean URL, use it everywhere, consistently.&lt;/li&gt;
&lt;li&gt;Email signature, CV, speaker one-sheets, guest bio blurbs, your website's "about" or "contact" page, your Google Business Profile if you're a service provider, printed materials, and anywhere you're asked for a "website" field on a form that doesn't have its own dedicated LinkedIn slot.&lt;/li&gt;
&lt;li&gt;Follow link to easily share a personalized link or button on your web channels, email, or other platforms. This link or button allows anyone to start following you with just a click.&lt;/li&gt;
&lt;li&gt;The criteria for access to the Follow link: A history of abiding by our Professional Community Policies and a good standing record on LinkedIn, and Geographic location is outside of mainland China.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Boosting a post will turn the post into an ad.
&lt;/h2&gt;

&lt;p&gt;As a LinkedIn member, you can boost your posts on the LinkedIn feed to increase your visibility, grow your followers, and get more website clicks. You can select your budget and target audience to boost key posts, increasing visibility to target audiences by selecting from facets including location, language, job title, job function, company industries, and job seniorities.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You can boost your personal LinkedIn posts with a Premium Business Suite subscription. We're also gradually releasing this feature to members without a Premium Business subscription.&lt;/li&gt;
&lt;li&gt;With the Premium All-in-One subscription (formerly LinkedIn Premium Business Suite), you receive monthly boost credits to enhance your marketing efforts.&lt;/li&gt;
&lt;li&gt;Boosting is gradually being released. You might not have access to it at this time, and some functionality might change over time.&lt;/li&gt;
&lt;li&gt;Boost credits included with Premium All-in-One can only be used to boost posts from your personal profile. You can't use these credits to boost posts from a LinkedIn Page.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Automated inauthentic activity violates the LinkedIn User Agreement and can result in temporary or permanent restriction of your account.
&lt;/h2&gt;

&lt;p&gt;In order to protect our members' data and our website, we don't permit the use of any third party software, including "crawlers", bots, browser plug-ins, or browser extensions that scrape, modify the appearance of, or automate activity on LinkedIn's website. We also don't permit the use of fake accounts or fake engagement on LinkedIn's website, including any tools or services that try to manipulate LinkedIn's content algorithms. Suspensions rarely arrive with zero warning. Watch for these signals and treat them as a reason to slow down immediately:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Unexpected CAPTCHA prompts during normal browsing or messaging.&lt;/li&gt;
&lt;li&gt;Phone or ID verification requests out of nowhere.&lt;/li&gt;
&lt;li&gt;"Restricted" labels on search results or messaging limits appearing without explanation.&lt;/li&gt;
&lt;li&gt;A sudden drop in connection acceptance or reply rate week over week.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Here's a concrete 30-day plan that grows both followers and connections at the same time.
&lt;/h2&gt;

&lt;p&gt;It assumes you post 3x a week and send ~20 connection requests per week — volumes that keep you well under LinkedIn's limits. After 30 days, you'll have posted ~12 times, sent ~50-60 connection requests, and engaged on ~100 posts. Most people see their first viral-ish post (10K+ impressions) somewhere between days 20-60 if they're consistent.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Week 1: Setup. Rewrite your headline and banner around a specific niche. Pin 3 featured posts (or a case study link). List your 3 core topics — every post for the next month fits one of them. Make a list of 20 creators in your niche. Follow them, turn on notifications for 5.&lt;/li&gt;
&lt;li&gt;Week 2: Engage before you post. Comment thoughtfully on 5 posts per day from your creator list. 2-3 sentences, specific, not generic. Publish 3 posts this week — one tactical, one story, one opinion. Send 10 connection requests to people who engaged with your comments this week.&lt;/li&gt;
&lt;li&gt;Week 3: Consistency. Publish 3-4 posts. Try a document/carousel post this week. Send 15-20 connection requests — target people who engaged with your posts or your comments. DM 3 people you've been interacting with publicly. No pitch — just continue the conversation.&lt;/li&gt;
&lt;li&gt;Week 4: Review and double down. Check analytics: which post type got the most saves and comments? Do more of what worked. Drop what didn't. Send 20 more connection requests. Post 3 times. Keep engaging daily.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Impressions, likes, and follower count are numbers teams can see, not inputs the algorithm uses to decide who sees your next post.
&lt;/h2&gt;

&lt;p&gt;The only LinkedIn metrics worth tracking are follower growth in your ICP, saves and DMs, qualified profile visits, and inbound conversations — not likes or impressions. Likes are cheap and lie. A post with 300 likes from adjacent audiences is worth less than a post with 40 likes from 40 potential buyers. When follower growth stalls, check upstream first.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;After every post, track: 1. Saves 2. Meaningful comments 3. Profile visits 4. Shares or sends if you have access to that data 5. DMs, connection requests, and leads that came in after the post&lt;/li&gt;
&lt;li&gt;Profile views down means hooks or formats stopped working - audit the last 4 posts.&lt;/li&gt;
&lt;li&gt;Save rate down means you're posting opinion, not reference - add a framework or specific numbers.&lt;/li&gt;
&lt;li&gt;Comment ratio down means weak CTAs or non-polarising topics - try a contrarian take.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Often, people with more experience, better content, and case studies lose to people who just figured out the rules of this game better and work more consistently.
&lt;/h2&gt;

&lt;p&gt;I grew from 2k to 10k followers in 10 months, and then from 10k to 15k followers in 8 months. I believe you'll be able to move faster after reading these lessons.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Collaborate with local influencers. A huge number of people in your industry do not speak English but need your product or lead magnet.&lt;/li&gt;
&lt;li&gt;Block AI comments under your posts. If you won't do it, people who leave good comments will ignore your posts. You are responsible for the quality of discussions under your posts!&lt;/li&gt;
&lt;li&gt;Followers is a proxy metric, but it works for trust. The number of followers doesn't pay bills. However, this proxy metric has a huge impact on the decision of your ICP whether it is worth accepting your connection request and reading your first message.&lt;/li&gt;
&lt;li&gt;Constantly asking why people add me to connections. A large part of the impact of your posts cannot be easily attributed to likes and comments. Most people who read your posts do not like or comment on them, but they do affect whether you are remembered and chosen.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How long does it take to grow on LinkedIn?
&lt;/h2&gt;

&lt;p&gt;Most people see noticeable growth (a few hundred new followers and a meaningful lift in post reach) after 60-90 days of consistent posting 3x per week. The first 30 days are usually slow because the algorithm is still learning your niche. If you're still flat after 90 days, the issue is almost always content quality or niche clarity — not time.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Plan for 8–12 weeks of consistent posting (3–5 times a week) before you see meaningful follower growth or inbound.&lt;/li&gt;
&lt;li&gt;The first month mostly builds the signal the algorithm uses to understand your topic. Months two and three are where compounding starts.&lt;/li&gt;
&lt;li&gt;If you already have 5,000+ connections in your ICP, you can see results in 30 to 45 days. If you're starting from scratch, 90 days is a more realistic benchmark.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How do I grow LinkedIn followers as a beginner with zero audience?
&lt;/h2&gt;

&lt;p&gt;Start by engaging before you post. Leave thoughtful comments on 5-10 posts per day from creators in your niche for two weeks. Their audience sees your comments, visits your profile, and follows if your content matches their interests. Then start posting 3x a week on a narrow topic. This "engage first, post second" approach gets you your first 500-1,000 followers faster than cold posting into a void.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Profile: Professional headshot, clear banner, and a headline that states your value proposition (not just your job title).&lt;/li&gt;
&lt;li&gt;Content: Comment on big creators' posts. Your goal is visibility in the comments section. 80% Commenting / 20% Posting.&lt;/li&gt;
&lt;li&gt;If your comment is smart, people will click your profile and follow you.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Can a LinkedIn company page send connection requests or DMs?
&lt;/h2&gt;

&lt;p&gt;No. LinkedIn does not allow company pages to send connection requests, direct messages, or InMail. All outreach on LinkedIn originates from personal accounts. This is a platform-level constraint, not a strategy preference.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The algorithm trusts personal profiles.&lt;/li&gt;
&lt;li&gt;When an employee shares a post, the algorithm reads it as a personal recommendation, not a brand broadcast.&lt;/li&gt;
&lt;li&gt;People engage with people, and the feed is built around that fact.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>linkedin</category>
      <category>grow</category>
    </item>
    <item>
      <title>Sync any blog via API to Substack in one-click</title>
      <dc:creator>Deal Breaker</dc:creator>
      <pubDate>Mon, 28 Sep 2026 11:33:08 +0000</pubDate>
      <link>https://dev.to/dealbreaker/sync-any-blog-via-api-to-substack-in-one-click-l26</link>
      <guid>https://dev.to/dealbreaker/sync-any-blog-via-api-to-substack-in-one-click-l26</guid>
      <description>&lt;p&gt;I created an API library that can sync any blog to Substack in one click. Notes and articles included.&lt;/p&gt;

&lt;p&gt;It works with Claude, Codex, Cursor, or any agent.&lt;/p&gt;

&lt;p&gt;Substack has no official public posting API. You write somewhere else, then you live in their browser editor. I wanted a client that can post Notes and newsletter articles from a script, a terminal, or an agent — draft, publish, schedule, tag, and delete without that UI.&lt;/p&gt;

&lt;p&gt;The library is three products, not one package:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Python client&lt;/strong&gt; for scripts and apps&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CLI&lt;/strong&gt; (&lt;code&gt;substack-api&lt;/code&gt;) for the terminal&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MCP server&lt;/strong&gt; (&lt;code&gt;substack-api-mcp&lt;/code&gt;) for Cursor, Claude, and other MCP hosts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Keys and docs live on &lt;a href="https://apisubstack.com/" rel="noopener noreferrer"&gt;apisubstack.com&lt;/a&gt;. Python client + CLI: &lt;a href="https://github.com/alxgntv/substack-api-client" rel="noopener noreferrer"&gt;substack-api-client&lt;/a&gt;. MCP: &lt;a href="https://github.com/alxgntv/substack-api-mcp" rel="noopener noreferrer"&gt;substack-api-mcp&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quick start
&lt;/h2&gt;

&lt;p&gt;Generate an &lt;code&gt;ask_*&lt;/code&gt; key, then either paste the MCP config into your agent or verify the key over HTTP.&lt;/p&gt;

&lt;h3&gt;
  
  
  MCP
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"substack-api"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"substack-api-mcp"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"env"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"APISUBSTACK_API_KEY"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ask_YOUR_KEY"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"SUBSTACK_PUBLICATION_URL"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://yourname.substack.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"SUBSTACK_SID"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"YOUR_SUBSTACK_SID_VALUE"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Verify the key
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl https://rest.apisubstack.com/api/v1/keys/verify &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer ask_YOUR_KEY"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;a href="https://apisubstack.com/#get-started" class="crayons-btn crayons-btn--primary" rel="noopener noreferrer"&gt;Generate API key&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;You also need:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;SUBSTACK_PUBLICATION_URL&lt;/code&gt; — &lt;code&gt;*.substack.com&lt;/code&gt; or a custom domain&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;SUBSTACK_SID&lt;/code&gt; — the unofficial &lt;code&gt;substack.sid&lt;/code&gt; browser session cookie&lt;/li&gt;
&lt;li&gt;optional &lt;code&gt;SUBSTACK_USER_ID&lt;/code&gt; — otherwise the client resolves it from &lt;code&gt;profile/self&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Two things that bite people: the SID expires (refresh it on 401/403), and every Substack endpoint is &lt;strong&gt;1 request per second&lt;/strong&gt;. Do not poll. Do not hammer drafts from a loop.&lt;/p&gt;

&lt;p&gt;Plain text is converted to ProseMirror &lt;code&gt;draft_body&lt;/code&gt; for you. Cover images are URL strings only — there is no binary upload in the SDK.&lt;/p&gt;
&lt;h2&gt;
  
  
  Install
&lt;/h2&gt;

&lt;p&gt;If the Python client, the CLI, or the MCP server is already installed, skip this and jump to the method you need. If nothing is installed yet, install &lt;strong&gt;one&lt;/strong&gt; product.&lt;/p&gt;

&lt;p&gt;Python client and CLI (one repo): &lt;a href="https://github.com/alxgntv/substack-api-client" rel="noopener noreferrer"&gt;https://github.com/alxgntv/substack-api-client&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python3 &lt;span class="nt"&gt;-m&lt;/span&gt; venv .venv
&lt;span class="nb"&gt;source&lt;/span&gt; .venv/bin/activate
pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements.txt
pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;span class="c"&gt;# CLI command: substack-api&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;MCP server (separate product): &lt;a href="https://github.com/alxgntv/substack-api-mcp" rel="noopener noreferrer"&gt;https://github.com/alxgntv/substack-api-mcp&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python3 &lt;span class="nt"&gt;-m&lt;/span&gt; venv .venv
&lt;span class="nb"&gt;source&lt;/span&gt; .venv/bin/activate
pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;span class="c"&gt;# MCP command: substack-api-mcp&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  What you can call
&lt;/h2&gt;

&lt;p&gt;Notes go through Substack's global &lt;code&gt;https://substack.com/api/v1&lt;/code&gt; host. Drafts, publish, schedule, and tags go through &lt;code&gt;{publication}/api/v1&lt;/code&gt;. &lt;code&gt;create_post()&lt;/code&gt; is an SDK flow (create → update → optional tags → publish or schedule), not a single HTTP call.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Method&lt;/th&gt;
&lt;th&gt;Python&lt;/th&gt;
&lt;th&gt;CLI&lt;/th&gt;
&lt;th&gt;MCP&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Create note&lt;/td&gt;
&lt;td&gt;&lt;code&gt;create_note()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;create-note&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;create_note&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Delete note&lt;/td&gt;
&lt;td&gt;&lt;code&gt;delete_note()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;delete-note&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;delete_note&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Create / publish / schedule&lt;/td&gt;
&lt;td&gt;&lt;code&gt;create_post()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;create&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;create_post&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Create draft&lt;/td&gt;
&lt;td&gt;&lt;code&gt;create_draft()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;create --draft-only&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;create_post&lt;/code&gt; (&lt;code&gt;draft_only=true&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Delete draft&lt;/td&gt;
&lt;td&gt;&lt;code&gt;delete_draft()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;delete-draft&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;delete_draft&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI check (Pangram)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;pangram_detection()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;pangram-detection&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;pangram_detection&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Verify auth / profile&lt;/td&gt;
&lt;td&gt;&lt;code&gt;get_profile_self()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;profile&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;test_connection&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Get draft&lt;/td&gt;
&lt;td&gt;&lt;code&gt;get_draft()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;get-draft&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;get_draft&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Update draft&lt;/td&gt;
&lt;td&gt;&lt;code&gt;update_draft()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;update-draft&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;update_draft&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Publish now&lt;/td&gt;
&lt;td&gt;&lt;code&gt;publish_now()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;publish&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;publish_post&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Schedule&lt;/td&gt;
&lt;td&gt;&lt;code&gt;schedule_release()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;schedule&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;schedule_post&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;List tags&lt;/td&gt;
&lt;td&gt;&lt;code&gt;list_post_tags()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;list-tags&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;list_tags&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Create tag&lt;/td&gt;
&lt;td&gt;&lt;code&gt;create_post_tag()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;create-tag&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;create_tag&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Attach tags&lt;/td&gt;
&lt;td&gt;&lt;code&gt;set_post_tags()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;set-tags&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;set_tags&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Get post tags&lt;/td&gt;
&lt;td&gt;&lt;code&gt;get_post_tags()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;get-post-tags&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;get_post_tags&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Rate limit for every endpoint: &lt;strong&gt;1 request per second&lt;/strong&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  API reference
&lt;/h2&gt;

&lt;p&gt;Request, response, Python, CLI, and MCP for each method.&lt;/p&gt;
&lt;h3&gt;
  
  
  Create note
&lt;/h3&gt;

&lt;p&gt;Publish a Substack Note (feed comment). Optional link attachment is created first, then the note is posted.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Python: &lt;code&gt;create_note()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;CLI: &lt;code&gt;create-note&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;MCP: &lt;code&gt;create_note&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Rate limit: 1 request per second&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
  
  
  Request
&lt;/h4&gt;

&lt;p&gt;&lt;code&gt;POST (+ optional POST) https://substack.com/api/v1/comment/attachment (optional) → https://substack.com/api/v1/comment/feed&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Headers&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Required&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Cookie&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;substack.sid= (browser session cookie)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Accept&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;application/json&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Origin&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;Publication origin, e.g. &lt;a href="https://yourname.substack.com" rel="noopener noreferrer"&gt;https://yourname.substack.com&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Referer&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://substack.com/" rel="noopener noreferrer"&gt;https://substack.com/&lt;/a&gt; (same as get_profile_self)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;User-Agent&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;Browser User-Agent string (client sends a Chrome UA by default)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Content-Type&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;application/json&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Path params&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;None&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Query params&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;None&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Body&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Required&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;bodyJson&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;object&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;ProseMirror doc object. SDK reuses ensure_draft_body() / ensureDraftBody(), then sets attrs.schemaVersion=v1.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;attachmentIds&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string[]&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;Ids from POST /comment/attachment. SDK fills this when attachment_url is passed.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;tabId&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;Captured default: "for-you"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;surface&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;Captured default: "permalink"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;replyMinimumRole&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;Captured default: "everyone"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;(attachment)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;object&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;Optional first call POST /comment/attachment: { "url": string, "type": "link" }&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h4&gt;
  
  
  Response
&lt;/h4&gt;

&lt;p&gt;Type: &lt;code&gt;object&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fields&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Required&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;id&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;number&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;Note / feed comment id&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;type&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;Captured value: "feed"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;status&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;Captured value: "published"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;body&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;Plain-text body&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;body_json&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;object&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;ProseMirror bodyJson echo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;attachments&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;array&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;Attached posts/links when attachment_url was used&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h4&gt;
  
  
  Notes
&lt;/h4&gt;

&lt;p&gt;Same GLOBAL_API host as get_profile_self (&lt;a href="https://substack.com/api/v1" rel="noopener noreferrer"&gt;https://substack.com/api/v1&lt;/a&gt;), not {publication}/api/v1. Referer is &lt;a href="https://substack.com/" rel="noopener noreferrer"&gt;https://substack.com/&lt;/a&gt;. Origin stays the publication URL from existing _headers. Optional attachment is sequential: attachment then comment/feed. Captured surface=permalink tabId=for-you. Text-only notes omit attachmentIds. Image/file attachments were not in the capture (type=link only).&lt;/p&gt;
&lt;h4&gt;
  
  
  Python example
&lt;/h4&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;note&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create_note&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;nice&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;attachment_url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://yourname.substack.com/p/your-post&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;note&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;note&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h4&gt;
  
  
  CLI example
&lt;/h4&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;substack-api create-note &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--body&lt;/span&gt; &lt;span class="s2"&gt;"nice"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--attachment-url&lt;/span&gt; &lt;span class="s2"&gt;"https://yourname.substack.com/p/your-post"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Delete note
&lt;/h3&gt;

&lt;p&gt;Delete an existing Substack Note (feed comment) by id.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Python: &lt;code&gt;delete_note()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;CLI: &lt;code&gt;delete-note&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;MCP: &lt;code&gt;delete_note&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Rate limit: 1 request per second&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
  
  
  Request
&lt;/h4&gt;

&lt;p&gt;&lt;code&gt;DELETE https://substack.com/api/v1/comment/{id}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Headers&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Required&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Cookie&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;substack.sid= (browser session cookie)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Accept&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;application/json&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Origin&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;Publication origin, e.g. &lt;a href="https://yourname.substack.com" rel="noopener noreferrer"&gt;https://yourname.substack.com&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Referer&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://substack.com/" rel="noopener noreferrer"&gt;https://substack.com/&lt;/a&gt; (same as get_profile_self)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;User-Agent&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;Browser User-Agent string (client sends a Chrome UA by default)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Path params&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Required&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;id&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;`number \&lt;/td&gt;
&lt;td&gt;string`&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Query params&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;None&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Body&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;No request body&lt;/em&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  Response
&lt;/h4&gt;

&lt;p&gt;Type: &lt;code&gt;object (normalized by SDK)&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fields&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Required&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;status&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;"deleted"&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;SDK-normalized status&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;note_id&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;`number \&lt;/td&gt;
&lt;td&gt;string`&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;response&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;object&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;Raw Substack body (may be empty {})&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h4&gt;
  
  
  Notes
&lt;/h4&gt;

&lt;p&gt;Same GLOBAL_API host as create_note and get_profile_self. No request body. Reuses _request like delete_draft. Substack may return an empty response.&lt;/p&gt;
&lt;h4&gt;
  
  
  Python example
&lt;/h4&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;delete_note&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;123456&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h4&gt;
  
  
  CLI example
&lt;/h4&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;substack-api delete-note &lt;span class="nt"&gt;--note-id&lt;/span&gt; 123456
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Create draft / publish / schedule
&lt;/h3&gt;

&lt;p&gt;High-level SDK flow: create draft → update → optional tags → publish or schedule.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Python: &lt;code&gt;create_post()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;CLI: &lt;code&gt;create&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;MCP: &lt;code&gt;create_post&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Rate limit: 1 request per second&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
  
  
  Request
&lt;/h4&gt;

&lt;p&gt;&lt;code&gt;POST + PUT (+ optional) {publication}/api/v1/drafts → {publication}/api/v1/drafts/{id} → tags / publish / schedule&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Headers&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Required&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Cookie&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;substack.sid= (browser session cookie)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Accept&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;application/json&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Origin&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;Publication origin, e.g. &lt;a href="https://yourname.substack.com" rel="noopener noreferrer"&gt;https://yourname.substack.com&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Referer&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;Usually {publication}/publish or the draft editor URL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;User-Agent&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;Browser User-Agent string (client sends a Chrome UA by default)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Content-Type&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;application/json&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Path params&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;None&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Query params&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;None&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Body&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Required&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;title&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;Post title (SDK maps to draft_title on Substack)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;body&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;`string \&lt;/td&gt;
&lt;td&gt;object`&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;subtitle&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;Optional subtitle (default "")&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;audience&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;Who can read the post (default "everyone")&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;section_id&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;`number \&lt;/td&gt;
&lt;td&gt;null`&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;should_send_email&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;boolean&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;Email subscribers on publish (default true)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;schedule_at&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;`string \&lt;/td&gt;
&lt;td&gt;null`&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;publish&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;boolean&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;If true and schedule_at is null → publish now. CLI --draft-only / MCP draft_only=true sets this false&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;tags&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string[]&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;Tag names to ensure and attach after draft update&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h4&gt;
  
  
  Response
&lt;/h4&gt;

&lt;p&gt;Type: &lt;code&gt;object&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fields&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Required&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;draft_id&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;`number \&lt;/td&gt;
&lt;td&gt;string`&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;draft&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;object&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;Latest draft object from update_draft&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;publication_url&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;Normalized publication origin&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;edit_url&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;{publication}/publish/post/{draft_id}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;status&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;`"draft" \&lt;/td&gt;
&lt;td&gt;"published" \&lt;/td&gt;
&lt;td&gt;"scheduled"`&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;post_url&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;Public post URL when published&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;tags&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;array&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;Attach results when tags were requested&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h4&gt;
  
  
  Notes
&lt;/h4&gt;

&lt;p&gt;This is an SDK orchestration, not a single HTTP call. Underlying Substack calls use the headers above and JSON bodies documented on create-draft / update-draft / publish-now / schedule pages.&lt;/p&gt;
&lt;h4&gt;
  
  
  Python example
&lt;/h4&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create_post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Hello from API&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Plain text becomes ProseMirror draft_body.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;subtitle&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Optional&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;tags&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;api-test&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;publish&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;draft_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;post_url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h4&gt;
  
  
  CLI example
&lt;/h4&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;substack-api create &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--title&lt;/span&gt; &lt;span class="s2"&gt;"Hello from API"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--body&lt;/span&gt; &lt;span class="s2"&gt;"Plain text body"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--tags&lt;/span&gt; &lt;span class="s2"&gt;"api-test,newsletter"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Create draft (low-level)
&lt;/h3&gt;

&lt;p&gt;Create an empty/partial draft without publishing.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Python: &lt;code&gt;create_draft()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;CLI: &lt;code&gt;create --draft-only&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;MCP: &lt;code&gt;create_post (draft_only=true)&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Rate limit: 1 request per second&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
  
  
  Request
&lt;/h4&gt;

&lt;p&gt;&lt;code&gt;POST {publication}/api/v1/drafts&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Headers&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Required&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Cookie&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;substack.sid= (browser session cookie)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Accept&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;application/json&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Origin&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;Publication origin, e.g. &lt;a href="https://yourname.substack.com" rel="noopener noreferrer"&gt;https://yourname.substack.com&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Referer&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;Usually {publication}/publish or the draft editor URL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;User-Agent&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;Browser User-Agent string (client sends a Chrome UA by default)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Content-Type&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;application/json&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Path params&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;None&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Query params&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;None&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Body&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Required&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;draft_title&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;Title (SDK arg: title)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;draft_subtitle&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;Subtitle (SDK arg: subtitle)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;draft_body&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;ProseMirror JSON string (SDK accepts plain text or object)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;audience&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;Default "everyone"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;type&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;Post type, default "newsletter"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;draft_bylines&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;array&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;[{ "id": , "is_guest": false }]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;draft_section_id&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;`number \&lt;/td&gt;
&lt;td&gt;null`&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;section_chosen&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;boolean&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;Whether a section was selected&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;detect_language&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;boolean&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;Language detection flag (default true on create)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;translations&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;array&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;Usually []&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;draft_podcast_url&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;null&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;Sent as null for newsletter posts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;draft_podcast_duration&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;null&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;Sent as null for newsletter posts&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h4&gt;
  
  
  Response
&lt;/h4&gt;

&lt;p&gt;Type: &lt;code&gt;object&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fields&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Required&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;id&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;`number \&lt;/td&gt;
&lt;td&gt;string`&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;publication_id&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;`number \&lt;/td&gt;
&lt;td&gt;string`&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;draft_updated_at&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;Timestamp required for later PUT update_draft&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h4&gt;
  
  
  Notes
&lt;/h4&gt;

&lt;p&gt;Prefer create_post() for the full flow. Referer: {publication}/publish/post?type=newsletter.&lt;/p&gt;
&lt;h4&gt;
  
  
  Python example
&lt;/h4&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;draft&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create_draft&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Draft only&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;subtitle&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Hello&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;audience&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;everyone&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;draft&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;draft&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;draft_updated_at&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h4&gt;
  
  
  CLI example
&lt;/h4&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;substack-api create &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--title&lt;/span&gt; &lt;span class="s2"&gt;"Draft only"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--body&lt;/span&gt; &lt;span class="s2"&gt;"Hello"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--draft-only&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Delete draft
&lt;/h3&gt;

&lt;p&gt;Delete an existing draft.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Python: &lt;code&gt;delete_draft()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;CLI: &lt;code&gt;delete-draft&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;MCP: &lt;code&gt;delete_draft&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Rate limit: 1 request per second&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
  
  
  Request
&lt;/h4&gt;

&lt;p&gt;&lt;code&gt;DELETE {publication}/api/v1/drafts/{id}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Headers&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Required&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Cookie&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;substack.sid= (browser session cookie)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Accept&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;application/json&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Origin&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;Publication origin, e.g. &lt;a href="https://yourname.substack.com" rel="noopener noreferrer"&gt;https://yourname.substack.com&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Referer&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;Usually {publication}/publish or the draft editor URL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;User-Agent&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;Browser User-Agent string (client sends a Chrome UA by default)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Path params&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Required&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;id&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;`number \&lt;/td&gt;
&lt;td&gt;string`&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Query params&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;None&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Body&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;No request body&lt;/em&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  Response
&lt;/h4&gt;

&lt;p&gt;Type: &lt;code&gt;object (normalized by SDK)&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fields&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Required&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;status&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;"deleted"&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;SDK-normalized status&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;draft_id&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;`number \&lt;/td&gt;
&lt;td&gt;string`&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;response&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;object&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;Raw Substack body (may be empty {})&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h4&gt;
  
  
  Notes
&lt;/h4&gt;

&lt;p&gt;No request body. Substack may return an empty response.&lt;/p&gt;
&lt;h4&gt;
  
  
  Python example
&lt;/h4&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;delete_draft&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;123456&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h4&gt;
  
  
  CLI example
&lt;/h4&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;substack-api delete-draft &lt;span class="nt"&gt;--draft-id&lt;/span&gt; 123456
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Pangram AI / AI-slop check
&lt;/h3&gt;

&lt;p&gt;Run Substack's Pangram AI-text detection on a draft body (human / AI-assisted / AI fractions).&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Python: &lt;code&gt;pangram_detection()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;CLI: &lt;code&gt;pangram-detection&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;MCP: &lt;code&gt;pangram_detection&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Rate limit: 1 request per second&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
  
  
  Request
&lt;/h4&gt;

&lt;p&gt;&lt;code&gt;GET {publication}/api/v1/drafts/{id}/pangram_detection&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Headers&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Required&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Cookie&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;substack.sid= (browser session cookie)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Accept&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;application/json&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Origin&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;Publication origin, e.g. &lt;a href="https://yourname.substack.com" rel="noopener noreferrer"&gt;https://yourname.substack.com&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Referer&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;Usually {publication}/publish or the draft editor URL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;User-Agent&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;Browser User-Agent string (client sends a Chrome UA by default)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Path params&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Required&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;id&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;`number \&lt;/td&gt;
&lt;td&gt;string`&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Query params&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;None&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Body&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;No request body&lt;/em&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  Response
&lt;/h4&gt;

&lt;p&gt;Type: &lt;code&gt;object&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fields&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Required&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;type&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;Detection result type from Substack / Pangram&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;header&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;Human-readable summary header&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;fraction_ai&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;number&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;Estimated AI-generated fraction&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;fraction_ai_assisted&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;number&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;Estimated AI-assisted fraction&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;fraction_human&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;number&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;Estimated human-written fraction&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;details&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;any&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;Additional Pangram detail payload when present&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;disclosure&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;any&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;Disclosure / availability metadata when present&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h4&gt;
  
  
  Notes
&lt;/h4&gt;

&lt;p&gt;No request body. Path param only. Referer: {publication}/publish/post/{id}. Requires a draft with enough text for detection.&lt;/p&gt;
&lt;h4&gt;
  
  
  Python example
&lt;/h4&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pangram_detection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;123456&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;header&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;fraction_ai&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;fraction_human&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h4&gt;
  
  
  CLI example
&lt;/h4&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;substack-api pangram-detection &lt;span class="nt"&gt;--draft-id&lt;/span&gt; 123456
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Verify auth / profile
&lt;/h3&gt;

&lt;p&gt;Test session cookie and resolve current user profile.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Python: &lt;code&gt;get_profile_self()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;CLI: &lt;code&gt;profile&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;MCP: &lt;code&gt;test_connection&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Rate limit: 1 request per second&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
  
  
  Request
&lt;/h4&gt;

&lt;p&gt;&lt;code&gt;GET https://substack.com/api/v1/user/profile/self&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Headers&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Required&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Cookie&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;substack.sid= (browser session cookie)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Accept&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;application/json&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Origin&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://substack.com/" rel="noopener noreferrer"&gt;https://substack.com/&lt;/a&gt; (global profile endpoint)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Referer&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://substack.com/" rel="noopener noreferrer"&gt;https://substack.com/&lt;/a&gt; (global profile endpoint)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;User-Agent&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;Browser User-Agent string (client sends a Chrome UA by default)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Path params&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;None&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Query params&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;None&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Body&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;No request body&lt;/em&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  Response
&lt;/h4&gt;

&lt;p&gt;Type: &lt;code&gt;object&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fields&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Required&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;id&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;number&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;Substack user id (used in draft_bylines)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;...&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;any&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;Additional profile fields from Substack&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h4&gt;
  
  
  Notes
&lt;/h4&gt;

&lt;p&gt;No request body. Auth is only via Cookie: substack.sid. Used by resolve_user_id() when SUBSTACK_USER_ID is not set. MCP test_connection wraps this call.&lt;/p&gt;
&lt;h4&gt;
  
  
  Python example
&lt;/h4&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;substack_api_client&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;SubstackClient&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;SubstackAuth&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;SubstackClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;publication_url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://yourname.substack.com&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;auth&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nc"&gt;SubstackAuth&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_SUBSTACK_SID&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;profile&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_profile_self&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;profile&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h4&gt;
  
  
  CLI example
&lt;/h4&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;substack-api profile &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--publication-url&lt;/span&gt; &lt;span class="s2"&gt;"https://yourname.substack.com"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--sid&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$SUBSTACK_SID&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Get draft
&lt;/h3&gt;

&lt;p&gt;Fetch an existing draft by id.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Python: &lt;code&gt;get_draft()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;CLI: &lt;code&gt;get-draft&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;MCP: &lt;code&gt;get_draft&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Rate limit: 1 request per second&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
  
  
  Request
&lt;/h4&gt;

&lt;p&gt;&lt;code&gt;GET {publication}/api/v1/drafts/{id}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Headers&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Required&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Cookie&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;substack.sid= (browser session cookie)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Accept&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;application/json&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Origin&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;Publication origin, e.g. &lt;a href="https://yourname.substack.com" rel="noopener noreferrer"&gt;https://yourname.substack.com&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Referer&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;Usually {publication}/publish or the draft editor URL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;User-Agent&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;Browser User-Agent string (client sends a Chrome UA by default)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Path params&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Required&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;id&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;`number \&lt;/td&gt;
&lt;td&gt;string`&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Query params&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;None&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Body&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;No request body&lt;/em&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  Response
&lt;/h4&gt;

&lt;p&gt;Type: &lt;code&gt;object&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fields&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Required&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;id&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;`number \&lt;/td&gt;
&lt;td&gt;string`&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;draft_title&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;Title&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;draft_subtitle&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;Subtitle&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;draft_body&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;ProseMirror JSON string&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;draft_updated_at&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;Optimistic-concurrency stamp for PUT&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h4&gt;
  
  
  Notes
&lt;/h4&gt;

&lt;p&gt;No request body. Path param only. Referer: {publication}/publish/post/{id}.&lt;/p&gt;
&lt;h4&gt;
  
  
  Python example
&lt;/h4&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;draft&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_draft&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;123456&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;draft&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;draft_title&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;draft&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;draft_updated_at&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h4&gt;
  
  
  CLI example
&lt;/h4&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;substack-api get-draft &lt;span class="nt"&gt;--draft-id&lt;/span&gt; 123456
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Update draft
&lt;/h3&gt;

&lt;p&gt;Update title, subtitle, body, audience, section, email flag, or cover_image URL.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Python: &lt;code&gt;update_draft()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;CLI: &lt;code&gt;update-draft&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;MCP: &lt;code&gt;update_draft&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Rate limit: 1 request per second&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
  
  
  Request
&lt;/h4&gt;

&lt;p&gt;&lt;code&gt;PUT {publication}/api/v1/drafts/{id}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Headers&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Required&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Cookie&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;substack.sid= (browser session cookie)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Accept&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;application/json&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Origin&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;Publication origin, e.g. &lt;a href="https://yourname.substack.com" rel="noopener noreferrer"&gt;https://yourname.substack.com&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Referer&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;Usually {publication}/publish or the draft editor URL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;User-Agent&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;Browser User-Agent string (client sends a Chrome UA by default)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Content-Type&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;application/json&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Path params&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Required&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;id&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;`number \&lt;/td&gt;
&lt;td&gt;string`&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Query params&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;None&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Body&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Required&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;last_updated_at&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;From latest get_draft/create_draft (client fetches it if omitted in SDK)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;draft_bylines&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;array&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;[{ "id": , "is_guest": false }]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;detect_language&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;boolean&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;Usually false on update&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;translations&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;array&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;Usually []&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;draft_title&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;SDK arg: title&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;draft_subtitle&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;SDK arg: subtitle&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;draft_body&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;ProseMirror JSON. SDK arg: body (plain text or object)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;audience&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;Audience string&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;draft_section_id&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;`number \&lt;/td&gt;
&lt;td&gt;null`&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;section_chosen&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;boolean&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;Set true when draft_section_id is set&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;should_send_email&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;boolean&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;SDK arg: should_send_email&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;write_comment_permissions&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;e.g. "everyone"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;cover_image&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;`string \&lt;/td&gt;
&lt;td&gt;null`&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h4&gt;
  
  
  Response
&lt;/h4&gt;

&lt;p&gt;Type: &lt;code&gt;object&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fields&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Required&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;id&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;`number \&lt;/td&gt;
&lt;td&gt;string`&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;draft_updated_at&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;New concurrency stamp&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;draft_title&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;Updated title&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h4&gt;
  
  
  Notes
&lt;/h4&gt;

&lt;p&gt;Binary image upload is not implemented. Only cover_image URL strings are supported.&lt;/p&gt;
&lt;h4&gt;
  
  
  Python example
&lt;/h4&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;updated&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;update_draft&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="mi"&gt;123456&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Updated title&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;New body&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;cover_image&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://cdn.example.com/cover.jpg&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;updated&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;draft_updated_at&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h4&gt;
  
  
  CLI example
&lt;/h4&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;substack-api update-draft &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--draft-id&lt;/span&gt; 123456 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--title&lt;/span&gt; &lt;span class="s2"&gt;"Updated title"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--body&lt;/span&gt; &lt;span class="s2"&gt;"New body"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Publish now
&lt;/h3&gt;

&lt;p&gt;Publish an existing draft immediately.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Python: &lt;code&gt;publish_now()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;CLI: &lt;code&gt;publish&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;MCP: &lt;code&gt;publish_post&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Rate limit: 1 request per second&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
  
  
  Request
&lt;/h4&gt;

&lt;p&gt;&lt;code&gt;POST {publication}/api/v1/drafts/{id}/publish&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Headers&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Required&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Cookie&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;substack.sid= (browser session cookie)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Accept&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;application/json&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Origin&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;Publication origin, e.g. &lt;a href="https://yourname.substack.com" rel="noopener noreferrer"&gt;https://yourname.substack.com&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Referer&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;Usually {publication}/publish or the draft editor URL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;User-Agent&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;Browser User-Agent string (client sends a Chrome UA by default)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Content-Type&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;application/json&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Path params&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Required&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;id&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;`number \&lt;/td&gt;
&lt;td&gt;string`&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Query params&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;None&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Body&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Required&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;send&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;boolean&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;Email subscribers (SDK arg: send_email, default true)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;share_automatically&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;boolean&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;Default false&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;audience&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;Default "everyone"&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h4&gt;
  
  
  Response
&lt;/h4&gt;

&lt;p&gt;Type: &lt;code&gt;object&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fields&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Required&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;id&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;`number \&lt;/td&gt;
&lt;td&gt;string`&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;slug&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;Public slug&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;is_published&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;boolean&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;Publish flag&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h4&gt;
  
  
  Notes
&lt;/h4&gt;

&lt;p&gt;Referer: {publication}/publish/post/{id}.&lt;/p&gt;
&lt;h4&gt;
  
  
  Python example
&lt;/h4&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;published&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;publish_now&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;123456&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;send_email&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;audience&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;everyone&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;published&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;slug&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;published&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;is_published&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h4&gt;
  
  
  CLI example
&lt;/h4&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;substack-api publish &lt;span class="nt"&gt;--draft-id&lt;/span&gt; 123456
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Schedule
&lt;/h3&gt;

&lt;p&gt;Schedule a draft: optional prepublish GET, then scheduled_release POST.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Python: &lt;code&gt;schedule_release()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;CLI: &lt;code&gt;schedule&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;MCP: &lt;code&gt;schedule_post&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Rate limit: 1 request per second&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
  
  
  Request
&lt;/h4&gt;

&lt;p&gt;&lt;code&gt;GET then POST {publication}/api/v1/drafts/{id}/prepublish → {publication}/api/v1/drafts/{id}/scheduled_release&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Headers&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Required&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Cookie&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;substack.sid= (browser session cookie)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Accept&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;application/json&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Origin&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;Publication origin, e.g. &lt;a href="https://yourname.substack.com" rel="noopener noreferrer"&gt;https://yourname.substack.com&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Referer&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;Usually {publication}/publish or the draft editor URL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;User-Agent&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;Browser User-Agent string (client sends a Chrome UA by default)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Content-Type&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;application/json&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Path params&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Required&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;id&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;`number \&lt;/td&gt;
&lt;td&gt;string`&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Query params&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Required&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;publish_date&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;ISO-8601 UTC — query param on GET .../prepublish (same value as trigger_at)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Body&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Required&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;trigger_at&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;ISO-8601 UTC schedule time (POST scheduled_release body)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;post_audience&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;Default "everyone"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;email_audience&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;Default "everyone"&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h4&gt;
  
  
  Response
&lt;/h4&gt;

&lt;p&gt;Type: &lt;code&gt;any&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fields&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Required&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;(body)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;`object \&lt;/td&gt;
&lt;td&gt;empty`&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h4&gt;
  
  
  Notes
&lt;/h4&gt;

&lt;p&gt;When run_prepublish=true (default), client GETs prepublish first and raises if errors is non-empty. Content-Type applies to the POST only.&lt;/p&gt;
&lt;h4&gt;
  
  
  Python example
&lt;/h4&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;substack_api_client&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;utc_iso&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timedelta&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timezone&lt;/span&gt;

&lt;span class="n"&gt;when&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;utc_iso&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;timezone&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;utc&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nf"&gt;timedelta&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hours&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;schedule_release&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;123456&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;trigger_at&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;when&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h4&gt;
  
  
  CLI example
&lt;/h4&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;substack-api schedule &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--draft-id&lt;/span&gt; 123456 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--at&lt;/span&gt; &lt;span class="s2"&gt;"2026-08-10T15:00:00.000Z"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  List tags
&lt;/h3&gt;

&lt;p&gt;List publication post tags.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Python: &lt;code&gt;list_post_tags()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;CLI: &lt;code&gt;list-tags&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;MCP: &lt;code&gt;list_tags&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Rate limit: 1 request per second&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
  
  
  Request
&lt;/h4&gt;

&lt;p&gt;&lt;code&gt;GET {publication}/api/v1/publication/post-tag&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Headers&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Required&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Cookie&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;substack.sid= (browser session cookie)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Accept&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;application/json&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Origin&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;Publication origin, e.g. &lt;a href="https://yourname.substack.com" rel="noopener noreferrer"&gt;https://yourname.substack.com&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Referer&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;Usually {publication}/publish or the draft editor URL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;User-Agent&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;Browser User-Agent string (client sends a Chrome UA by default)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Path params&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;None&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Query params&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;None&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Body&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;No request body&lt;/em&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  Response
&lt;/h4&gt;

&lt;p&gt;Type: &lt;code&gt;array&amp;lt;object&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fields&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Required&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;id&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;Tag id&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;name&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;Tag display name&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;slug&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;Tag slug&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h4&gt;
  
  
  Notes
&lt;/h4&gt;

&lt;p&gt;No request body. Referer: {publication}/publish.&lt;/p&gt;
&lt;h4&gt;
  
  
  Python example
&lt;/h4&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;tags&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;list_post_tags&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;tag&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;tags&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tag&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;tag&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h4&gt;
  
  
  CLI example
&lt;/h4&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;substack-api list-tags
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Create tag
&lt;/h3&gt;

&lt;p&gt;Create a new publication post tag.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Python: &lt;code&gt;create_post_tag()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;CLI: &lt;code&gt;create-tag&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;MCP: &lt;code&gt;create_tag&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Rate limit: 1 request per second&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
  
  
  Request
&lt;/h4&gt;

&lt;p&gt;&lt;code&gt;POST {publication}/api/v1/publication/post-tag&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Headers&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Required&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Cookie&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;substack.sid= (browser session cookie)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Accept&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;application/json&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Origin&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;Publication origin, e.g. &lt;a href="https://yourname.substack.com" rel="noopener noreferrer"&gt;https://yourname.substack.com&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Referer&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;Usually {publication}/publish or the draft editor URL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;User-Agent&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;Browser User-Agent string (client sends a Chrome UA by default)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Content-Type&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;application/json&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Path params&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;None&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Query params&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;None&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Body&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Required&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;name&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;New tag name&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h4&gt;
  
  
  Response
&lt;/h4&gt;

&lt;p&gt;Type: &lt;code&gt;object&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fields&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Required&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;id&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;Created tag id&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;name&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;Tag name&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;slug&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;Tag slug&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h4&gt;
  
  
  Notes
&lt;/h4&gt;

&lt;p&gt;Does not attach the tag to a post — use set_post_tags / attach_post_tag.&lt;/p&gt;
&lt;h4&gt;
  
  
  Python example
&lt;/h4&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;tag&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create_post_tag&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;product of the day&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tag&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;tag&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;slug&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h4&gt;
  
  
  CLI example
&lt;/h4&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;substack-api create-tag &lt;span class="nt"&gt;--name&lt;/span&gt; &lt;span class="s2"&gt;"product of the day"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Attach tags
&lt;/h3&gt;

&lt;p&gt;Ensure tags exist (create missing) and attach them to a post/draft.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Python: &lt;code&gt;set_post_tags()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;CLI: &lt;code&gt;set-tags&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;MCP: &lt;code&gt;set_tags&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Rate limit: 1 request per second&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
  
  
  Request
&lt;/h4&gt;

&lt;p&gt;&lt;code&gt;GET/POST + POST {publication}/api/v1/publication/post-tag → {publication}/api/v1/post/{id}/tag/{tag_id}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Headers&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Required&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Cookie&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;substack.sid= (browser session cookie)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Accept&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;application/json&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Origin&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;Publication origin, e.g. &lt;a href="https://yourname.substack.com" rel="noopener noreferrer"&gt;https://yourname.substack.com&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Referer&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;Usually {publication}/publish or the draft editor URL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;User-Agent&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;Browser User-Agent string (client sends a Chrome UA by default)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Content-Type&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;application/json&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Path params&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Required&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;id&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;`number \&lt;/td&gt;
&lt;td&gt;string`&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;tag_id&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;Tag id in attach URL&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Query params&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;None&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Body&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Required&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;(create tag)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;object&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;When creating missing tags: { "name": string }&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;(attach tag)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;object&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;Empty JSON object {} on POST /post/{id}/tag/{tag_id}&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h4&gt;
  
  
  Response
&lt;/h4&gt;

&lt;p&gt;Type: &lt;code&gt;array&amp;lt;object&amp;gt; (SDK normalized)&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fields&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Required&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;tag&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;object&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;Resolved/created tag&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;status&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;`"attached" \&lt;/td&gt;
&lt;td&gt;"already_attached"`&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;link&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;object&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;Raw attach response when newly attached&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h4&gt;
  
  
  Notes
&lt;/h4&gt;

&lt;p&gt;SDK args: post_id + tag_names[]. Internally: list/create tags, then attach with empty JSON body.&lt;/p&gt;
&lt;h4&gt;
  
  
  Python example
&lt;/h4&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;attached&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set_post_tags&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;123456&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;api-test&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;newsletter&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;attached&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h4&gt;
  
  
  CLI example
&lt;/h4&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;substack-api set-tags &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--post-id&lt;/span&gt; 123456 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--tags&lt;/span&gt; &lt;span class="s2"&gt;"api-test,newsletter"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Get post tags
&lt;/h3&gt;

&lt;p&gt;Read tags currently attached to a post.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Python: &lt;code&gt;get_post_tags()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;CLI: &lt;code&gt;get-post-tags&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;MCP: &lt;code&gt;get_post_tags&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Rate limit: 1 request per second&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
  
  
  Request
&lt;/h4&gt;

&lt;p&gt;&lt;code&gt;GET {publication}/api/v1/post/{id}/tag&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Headers&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Required&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Cookie&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;substack.sid= (browser session cookie)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Accept&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;application/json&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Origin&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;Publication origin, e.g. &lt;a href="https://yourname.substack.com" rel="noopener noreferrer"&gt;https://yourname.substack.com&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Referer&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;Usually {publication}/publish or the draft editor URL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;User-Agent&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;Browser User-Agent string (client sends a Chrome UA by default)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Path params&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Required&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;id&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;`number \&lt;/td&gt;
&lt;td&gt;string`&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Query params&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;None&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Body&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;No request body&lt;/em&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  Response
&lt;/h4&gt;

&lt;p&gt;Type: &lt;code&gt;array&amp;lt;object&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fields&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Required&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;id&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;Tag or link id&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;post_tag_id&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;Attached tag id (used by set_post_tags dedupe)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;name&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;Tag name when present&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h4&gt;
  
  
  Notes
&lt;/h4&gt;

&lt;p&gt;No request body. Works for drafts and published posts.&lt;/p&gt;
&lt;h4&gt;
  
  
  Python example
&lt;/h4&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;tags&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_post_tags&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;123456&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tags&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h4&gt;
  
  
  CLI example
&lt;/h4&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;substack-api get-post-tags &lt;span class="nt"&gt;--post-id&lt;/span&gt; 123456
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  Auth
&lt;/h2&gt;

&lt;p&gt;Product gate: &lt;code&gt;APISUBSTACK_API_KEY&lt;/code&gt; is required. Substack itself is authenticated with the unofficial &lt;code&gt;substack.sid&lt;/code&gt; cookie.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cookie: &lt;code&gt;substack.sid&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;API key: &lt;code&gt;APISUBSTACK_API_KEY&lt;/code&gt; (&lt;code&gt;ask_*&lt;/code&gt; from &lt;a href="https://apisubstack.com/" rel="noopener noreferrer"&gt;apisubstack.com&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Env: &lt;code&gt;APISUBSTACK_API_KEY&lt;/code&gt;, &lt;code&gt;SUBSTACK_PUBLICATION_URL&lt;/code&gt;, &lt;code&gt;SUBSTACK_SID&lt;/code&gt;, &lt;code&gt;SUBSTACK_USER_ID&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Verify: &lt;code&gt;GET https://rest.apisubstack.com/api/v1/keys/verify&lt;/code&gt; with &lt;code&gt;Authorization: Bearer ask_…&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;div class="ltag-offer"&gt;
  &lt;div class="ltag-offer__body"&gt;
&lt;br&gt;
Posting, drafting, deletion, tags. Notes and articles.&lt;br&gt;
&lt;/div&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;a href="https://apisubstack.com/login" class="ltag-offer__button crayons-btn crayons-btn--primary"&amp;gt;Start free — $9/mo after&amp;lt;/a&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;br&gt;


&lt;p&gt;If you write and publish a newsletter and you want posts out of your editor (or your agent) and into Substack without the browser UI, this is the client.&lt;/p&gt;

</description>
      <category>api</category>
      <category>mcp</category>
      <category>substack</category>
      <category>python</category>
    </item>
    <item>
      <title>How The New LinkedIn Algorithm Works in 2025 – The Ultimate Guide to LinkedIn Growth</title>
      <dc:creator>Deal Breaker</dc:creator>
      <pubDate>Sat, 08 Mar 2025 05:24:15 +0000</pubDate>
      <link>https://dev.to/dealbreaker/how-the-new-linkedin-algorithm-works-in-2025-the-ultimate-guide-to-linkedin-growth-4bcf</link>
      <guid>https://dev.to/dealbreaker/how-the-new-linkedin-algorithm-works-in-2025-the-ultimate-guide-to-linkedin-growth-4bcf</guid>
      <description>&lt;p&gt;Most people on LinkedIn are making one big mistake. They think&amp;nbsp;&lt;strong&gt;growing LinkedIn followers&lt;/strong&gt;&amp;nbsp;= building a business. But here’s the truth: Only&amp;nbsp;&lt;strong&gt;3% of your perfect prospects&lt;/strong&gt;&amp;nbsp;will reach out to you first.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fccta561hrakr7vh3dc71.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fccta561hrakr7vh3dc71.jpeg" alt="How The New LinkedIn Algorithm Works in 2025 – The Ultimate Guide to LinkedIn Growth" width="800" height="1000"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Author:&amp;nbsp;&lt;a href="https://www.linkedin.com/in/donnellychris/" rel="noopener noreferrer"&gt;https://www.linkedin.com/in/donnellychris/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So what about the other&amp;nbsp;&lt;strong&gt;97%&lt;/strong&gt;?&lt;/p&gt;

&lt;p&gt;If you’re looking to&amp;nbsp;&lt;strong&gt;grow on LinkedIn&lt;/strong&gt;,&amp;nbsp;&lt;strong&gt;boost your LinkedIn posts&lt;/strong&gt;, and&amp;nbsp;&lt;strong&gt;increase engagement&lt;/strong&gt;, LinkedIn is still the best platform for doing so.&lt;/p&gt;

&lt;p&gt;Unfortunately, too many people adopt the wrong approach, waste their time, and give up before they’ve even&amp;nbsp;&lt;strong&gt;gotten more followers on LinkedIn&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;If you’re feeling frustrated and ready to quit,&amp;nbsp;&lt;strong&gt;you need this cheat sheet&lt;/strong&gt;&amp;nbsp;to start seeing real results.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This article inspired by:&amp;nbsp;&lt;a href="https://www.linkedin.com/in/donnellychris/" rel="noopener noreferrer"&gt;https://www.linkedin.com/in/donnellychris/&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The State of LinkedIn in 2025 — Why Organic Reach is Dropping
&lt;/h2&gt;

&lt;p&gt;LinkedIn’s organic reach has&amp;nbsp;&lt;strong&gt;declined dramatically&lt;/strong&gt;, with the average post receiving&amp;nbsp;&lt;strong&gt;65% fewer impressions&lt;/strong&gt;&amp;nbsp;than in 2024. While reach is down, engagement per post has actually&amp;nbsp;&lt;strong&gt;increased by 12%&lt;/strong&gt;, meaning the right&amp;nbsp;&lt;strong&gt;LinkedIn growth strategy&lt;/strong&gt;&amp;nbsp;still works.&lt;/p&gt;

&lt;p&gt;LinkedIn has also increased advertising space by&amp;nbsp;&lt;strong&gt;16%&lt;/strong&gt;, which means more&amp;nbsp;&lt;strong&gt;promotion posts on LinkedIn&lt;/strong&gt;&amp;nbsp;and&amp;nbsp;&lt;strong&gt;less visibility for organic content&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The key to&amp;nbsp;&lt;strong&gt;growing followers on LinkedIn&lt;/strong&gt;?&amp;nbsp;&lt;strong&gt;Posting consistently.&lt;/strong&gt;&amp;nbsp;Users who post&amp;nbsp;&lt;strong&gt;1–2 times per day&lt;/strong&gt;&amp;nbsp;see&amp;nbsp;&lt;strong&gt;compounding engagement&lt;/strong&gt;&amp;nbsp;and significantly&amp;nbsp;&lt;strong&gt;boost their LinkedIn posts&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Not all content formats perform the same, though.&amp;nbsp;&lt;strong&gt;Carousels and PDFs outperform other formats by 1.9x&lt;/strong&gt;, while&amp;nbsp;&lt;strong&gt;video reach has plummeted by 200%&lt;/strong&gt;&amp;nbsp;year over year.&lt;/p&gt;

&lt;p&gt;Additionally,&amp;nbsp;&lt;strong&gt;LinkedIn comments have evolved&lt;/strong&gt;. AI-generated comments&amp;nbsp;&lt;strong&gt;no longer work&lt;/strong&gt;, and&amp;nbsp;&lt;strong&gt;longer, more thoughtful comments&lt;/strong&gt;&amp;nbsp;now drive the most engagement.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Science of LinkedIn Comments — How to Get More Engagement
&lt;/h2&gt;

&lt;p&gt;LinkedIn&amp;nbsp;&lt;strong&gt;prioritizes meaningful engagement&lt;/strong&gt;&amp;nbsp;over low-effort interactions.&lt;/p&gt;

&lt;p&gt;AI-generated comments receive&amp;nbsp;&lt;strong&gt;5x less response from post authors&lt;/strong&gt;&amp;nbsp;and&amp;nbsp;&lt;strong&gt;7x less response from audiences&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Longer comments perform better.&lt;/strong&gt;&amp;nbsp;A comment with&amp;nbsp;&lt;strong&gt;over 10 words&lt;/strong&gt;&amp;nbsp;has&amp;nbsp;&lt;strong&gt;2x more impact&lt;/strong&gt;, while comments&amp;nbsp;&lt;strong&gt;over 15 words&lt;/strong&gt;&amp;nbsp;have&amp;nbsp;&lt;strong&gt;2.5x more impact&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;If you&amp;nbsp;&lt;strong&gt;comment on 10–20 posts per day&lt;/strong&gt;, you’ll&amp;nbsp;&lt;strong&gt;grow LinkedIn followers&lt;/strong&gt;,&amp;nbsp;&lt;strong&gt;boost your LinkedIn post&lt;/strong&gt;, and increase profile views by&amp;nbsp;&lt;strong&gt;50%&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Want your posts to stay visible longer?&amp;nbsp;&lt;strong&gt;Engage with your own content.&lt;/strong&gt;&amp;nbsp;Go back to old posts, continue discussions, and keep the conversation going.&lt;/p&gt;

&lt;p&gt;The more&amp;nbsp;&lt;strong&gt;LinkedIn comments&lt;/strong&gt;&amp;nbsp;you receive and the more you engage, the more likely your content is to get promoted in the feed.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Format Your Posts to Grow on LinkedIn
&lt;/h2&gt;

&lt;p&gt;Not all post formats are created equal when trying to&amp;nbsp;&lt;strong&gt;grow LinkedIn followers&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Carousels&lt;/strong&gt;&amp;nbsp;are the highest-performing format and should have&amp;nbsp;&lt;strong&gt;a strong title and at least 10 slides&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Infographics&lt;/strong&gt;&amp;nbsp;work best when they’re&amp;nbsp;&lt;strong&gt;educational and data-driven&lt;/strong&gt;.&amp;nbsp;&lt;strong&gt;Visual content boosts your LinkedIn posts&lt;/strong&gt;&amp;nbsp;significantly.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Videos&lt;/strong&gt;&amp;nbsp;should follow the&amp;nbsp;&lt;strong&gt;TikTok model&lt;/strong&gt;: use a&amp;nbsp;&lt;strong&gt;3-second hook&lt;/strong&gt;&amp;nbsp;and focus on either&amp;nbsp;&lt;strong&gt;education or inspiration&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Polls&lt;/strong&gt;&amp;nbsp;help you&amp;nbsp;&lt;strong&gt;get more followers on LinkedIn&lt;/strong&gt;&amp;nbsp;by sparking discussions.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Text &amp;amp; Photo&lt;/strong&gt;&amp;nbsp;posts are best for&amp;nbsp;&lt;strong&gt;personal storytelling&lt;/strong&gt;&amp;nbsp;and building connections.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Text-only&lt;/strong&gt;&amp;nbsp;posts should be&amp;nbsp;&lt;strong&gt;short, direct, and pre-validated&lt;/strong&gt;&amp;nbsp;for impact.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If your goal is&amp;nbsp;&lt;strong&gt;LinkedIn growth&lt;/strong&gt;, prioritize&amp;nbsp;&lt;strong&gt;carousels and cheat sheets&lt;/strong&gt;, as they perform&amp;nbsp;&lt;strong&gt;significantly better&lt;/strong&gt;&amp;nbsp;than other formats.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Boost Your LinkedIn Post and Get More Followers
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Post in the right format&lt;/strong&gt;&amp;nbsp;—&amp;nbsp;&lt;strong&gt;Carousels and cheat sheets perform best&lt;/strong&gt;&amp;nbsp;for&amp;nbsp;&lt;strong&gt;promotion posts on LinkedIn&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Write longer posts&lt;/strong&gt;&amp;nbsp;—&amp;nbsp;&lt;strong&gt;800–1000 words perform 26% better&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Use shorter sentences&lt;/strong&gt;&amp;nbsp;—&amp;nbsp;&lt;strong&gt;10–12 words per sentence increase readability by 30%&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Include strong ideas and data&lt;/strong&gt;&amp;nbsp;—&amp;nbsp;&lt;strong&gt;Posts with data visualization perform 36% better&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Start with a two-sentence hook&lt;/strong&gt;&amp;nbsp;— This&amp;nbsp;&lt;strong&gt;boosts engagement by 20%&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Like your own post&lt;/strong&gt;&amp;nbsp;— This small trick can&amp;nbsp;&lt;strong&gt;increase reach by 5%&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Engage with older posts&lt;/strong&gt;&amp;nbsp;— Even posts that are&amp;nbsp;&lt;strong&gt;2–3 days old can continue growing&lt;/strong&gt;&amp;nbsp;with active discussion.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Maximize dwell time&lt;/strong&gt;&amp;nbsp;–&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Infographics and carousels&lt;/strong&gt;&amp;nbsp;increase dwell time and&amp;nbsp;&lt;strong&gt;perform 1.9x better&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Longer captions&lt;/strong&gt;&amp;nbsp;have the same effect, boosting engagement.&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Warm up your account before posting&lt;/strong&gt;&amp;nbsp;—&amp;nbsp;&lt;strong&gt;Spend 15 minutes engaging with others&lt;/strong&gt;&amp;nbsp;before posting your own content.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Reply to comments for 15–30 minutes&lt;/strong&gt;&amp;nbsp;— Keep the discussion alive, ask follow-up questions, and&amp;nbsp;&lt;strong&gt;stimulate deeper conversations&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you follow this system, you will&amp;nbsp;&lt;strong&gt;boost your LinkedIn posts&lt;/strong&gt;,&amp;nbsp;&lt;strong&gt;get more followers on LinkedIn&lt;/strong&gt;, and improve your overall&amp;nbsp;&lt;strong&gt;LinkedIn growth strategy&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;But what if you’re just starting out on LinkedIn and don’t have an audience yet?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A cold start is one of the biggest challenges when trying to&amp;nbsp;&lt;strong&gt;&lt;a href="https://upvote.club/linkedin" rel="noopener noreferrer"&gt;grow on LinkedIn&lt;/a&gt;&lt;/strong&gt;. You can create&amp;nbsp;&lt;strong&gt;high-quality content&lt;/strong&gt;, but without&amp;nbsp;&lt;strong&gt;initial engagement&lt;/strong&gt;, the algorithm won’t push your posts to a larger audience.&lt;/p&gt;

&lt;p&gt;This is where&amp;nbsp;&lt;strong&gt;Upvote.club&lt;/strong&gt;&amp;nbsp;comes in.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr5pv265pdszt2uzch8gp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr5pv265pdszt2uzch8gp.png" alt="LinkedIn Grow Tool" width="800" height="370"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Upvote.club helps creators and professionals&amp;nbsp;&lt;strong&gt;kickstart engagement on LinkedIn&lt;/strong&gt;&amp;nbsp;by connecting them with real users who like, comment, and share their posts. Instead of waiting months to&amp;nbsp;&lt;strong&gt;&lt;a href="https://upvote.club/linkedin/follow" rel="noopener noreferrer"&gt;get followers on LinkedIn&lt;/a&gt;&lt;/strong&gt;, you can&amp;nbsp;&lt;strong&gt;accelerate your LinkedIn growth&lt;/strong&gt;&amp;nbsp;and start seeing results immediately.&lt;/p&gt;

&lt;p&gt;Using&amp;nbsp;&lt;strong&gt;Upvote.club&lt;/strong&gt;&amp;nbsp;ensures that your posts&amp;nbsp;&lt;strong&gt;get the initial traction they need&lt;/strong&gt;, leading to:&lt;br&gt;&lt;br&gt;
✅&amp;nbsp;&lt;strong&gt;More LinkedIn comments&lt;/strong&gt;, boosting visibility.&lt;br&gt;&lt;br&gt;
✅&amp;nbsp;&lt;strong&gt;Higher reach and engagement&lt;/strong&gt;, making LinkedIn’s algorithm favor your content.&lt;br&gt;&lt;br&gt;
✅&amp;nbsp;&lt;strong&gt;A stronger network&lt;/strong&gt;, helping you&amp;nbsp;&lt;strong&gt;grow followers on LinkedIn&lt;/strong&gt;&amp;nbsp;faster.&lt;/p&gt;

&lt;p&gt;If you’ve been struggling with&amp;nbsp;&lt;strong&gt;low engagement and slow follower growth&lt;/strong&gt;,&amp;nbsp;&lt;strong&gt;Upvote.club&lt;/strong&gt;&amp;nbsp;can provide the&amp;nbsp;&lt;strong&gt;momentum you need to break through&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Sell on LinkedIn Without Sounding Salesy
&lt;/h2&gt;

&lt;p&gt;The biggest mistake people make?&amp;nbsp;&lt;strong&gt;Trying to sell too soon.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Instead, follow this approach:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Don’t Sell… SERVE 🤲&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;S → Show up consistently.&lt;br&gt;&lt;br&gt;
E → Educate.&lt;br&gt;&lt;br&gt;
R → Relate to their needs.&lt;br&gt;&lt;br&gt;
V → Value relationships over transactions.&lt;br&gt;&lt;br&gt;
E → Engage with authenticity.&lt;/p&gt;

&lt;p&gt;The&amp;nbsp;&lt;strong&gt;best way to grow on LinkedIn&lt;/strong&gt;&amp;nbsp;is to&amp;nbsp;&lt;strong&gt;serve your audience first&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Selling on LinkedIn is a&amp;nbsp;&lt;strong&gt;full process, but it is achievable&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;How are you getting on with selling on LinkedIn?&lt;br&gt;&lt;br&gt;
Let me know in the comments! ⬇️&lt;/p&gt;

&lt;h2&gt;
  
  
  Join Free LinkedIn Sales Training
&lt;/h2&gt;

&lt;p&gt;I’m hosting&amp;nbsp;&lt;strong&gt;“How To Sell On LinkedIn”&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sign up here:&lt;/strong&gt;&amp;nbsp;&lt;a href="https://lnkd.in/eMYw-JvF" rel="noopener noreferrer"&gt;https://lnkd.in/eMYw-JvF&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I’ve also asked&amp;nbsp;&lt;strong&gt;Will McTighe from SayWhat&lt;/strong&gt;&amp;nbsp;to&amp;nbsp;&lt;strong&gt;pick two attendees&lt;/strong&gt;&amp;nbsp;and create&amp;nbsp;&lt;strong&gt;incredible conversion content for them live on the call&lt;/strong&gt;.&lt;/p&gt;

</description>
      <category>marketing</category>
      <category>howto</category>
      <category>socialmedia</category>
    </item>
    <item>
      <title>30 X/Twitter promotion Tools: The Complete Guide to Growing to 10K Followers in 2024</title>
      <dc:creator>Deal Breaker</dc:creator>
      <pubDate>Sun, 05 Jan 2025 03:00:07 +0000</pubDate>
      <link>https://dev.to/dealbreaker/30-xtwitter-promotion-tools-the-complete-guide-to-growing-to-10k-followers-in-2024-4je8</link>
      <guid>https://dev.to/dealbreaker/30-xtwitter-promotion-tools-the-complete-guide-to-growing-to-10k-followers-in-2024-4je8</guid>
      <description>&lt;p&gt;Since Elon bought Twitter 2 years ago, the platform has gained a second life. Where Twitter was dying before, now it’s clearly coming alive and attracting more and more active audience to the platform. That’s cool.&lt;/p&gt;

&lt;p&gt;At the end of the article i will give most valuable strategy: how to get more followers on X/Twitter.&lt;/p&gt;

&lt;p&gt;When I was preparing this material, I encountered the fact that good tools for X/Twitter promotion seemed to have died or become very outdated.&lt;/p&gt;

&lt;p&gt;At the very end, I’ll propose a scheme that, in my opinion, is the most effective in 2024 for growing X/Twitter to 10k followers. Fist i must say it’s not easy. X/Twitter has a rather easy algorithm to rank in once your posts have been deemed relative to the topic, however just like running a website each account has their own authority levels.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu7wf5k1ouqxhndje6qyh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu7wf5k1ouqxhndje6qyh.png" alt="twitter marketing tools" width="800" height="478"&gt;&lt;/a&gt;  &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡&amp;nbsp;Golden Tip:&lt;/p&gt;

&lt;p&gt;Content still is king showcase your expertise, but the most effective way to promote on X/Twitter is to collect reactions to your posts. The more engagement, the faster the growth. Repeat this like a mantra.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;We’ll break down our tools into several groups:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Twitter/X Account Promotion Tools&lt;/li&gt;
&lt;li&gt;  Content Creation for Twitter/X&lt;/li&gt;
&lt;li&gt;  Twitter/X Analytics&lt;/li&gt;
&lt;li&gt;  Twitter/X Advertising&lt;/li&gt;
&lt;li&gt;  AI Tools for Twitter/X (can’t do without them)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Promotion Tools&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyzl9a5oogzvszycom0ob.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyzl9a5oogzvszycom0ob.png" alt="twitter marketing tools" width="800" height="298"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;a href="https://upvote.club/" rel="noopener noreferrer"&gt;upvote.club&lt;/a&gt;&amp;nbsp;— A fresh tool that works like this: you perform task, like, share, repost, follow, get points, and then spend these points to create your own tasks. Creators claim that audience quality is top priority, and bots are ruthlessly filtered out. Works very well, with really a lot of quality and live audience. Very cheap points and free task creation. For modest money, you’ll get maximum engagement on your posts.&lt;/li&gt;
&lt;li&gt; &lt;a href="https://twiends.com/" rel="noopener noreferrer"&gt;twiends&lt;/a&gt;&amp;nbsp;— An even simpler principle: you add your X/Twitter account, other people see it on the network, subscribe to you, and you subscribe to them. Want more account views? Pay, starting from $15 per week for 700 views. Generally a decent tool that really works, but quite expensive. Managed to get +20 subscribers in a week.&lt;/li&gt;
&lt;li&gt; &lt;a href="https://www.socialplug.io/" rel="noopener noreferrer"&gt;socialplug&lt;/a&gt;&amp;nbsp;— Essentially an ordinary store where you can buy X/Twitter followers or engagement for posts, likes, shares, reposts. Quality mostly resembles bots, but sometimes it gives an effect. Generally, I don’t really recommend buying followers because it doesn’t really give anything.&lt;/li&gt;
&lt;li&gt; &lt;a href="https://megaphone.network/" rel="noopener noreferrer"&gt;megafone.network&lt;/a&gt;&amp;nbsp;— Principle similar to upvote.club, you add your post, people come and do the action you requested: like, comment, repost. But the price is higher, account setup costs money + each action. Around $5 per action. I spent $10 +40$ and got likes from actually quality guys — that was pleasing. But globally, I didn’t see a significant effect.&lt;/li&gt;
&lt;li&gt; &lt;a href="https://owlead.com/inbound/" rel="noopener noreferrer"&gt;owlead&lt;/a&gt;&amp;nbsp;— Essentially a mass follower tool via Chrome extension. Very simple principle: you install the extension, choose your audience, it goes and likes and follows them, they follow you back. Working scheme? Yes, it works. Is it worth using? So-so, you choose.&lt;/li&gt;
&lt;li&gt; &lt;a href="https://www.like4like.org/" rel="noopener noreferrer"&gt;Like4Like&lt;/a&gt;&amp;nbsp;— Ooooold tool, an old site that’s somewhat very inconvenient. Same principle as upvote.club — like for like. I tested it, but I don’t like the audience here, maximally similar to bots, but there’s a lot of them. Up to you whether you want such followers in your account.&lt;/li&gt;
&lt;li&gt; &lt;a href="https://help.x.com/en/managing-your-account/about-x-verified-accounts" rel="noopener noreferrer"&gt;X/Twitter&amp;nbsp;Blue Checkmark&lt;/a&gt;&amp;nbsp;— Obviously why it was created. Yes, so you pay for it, but it also gives a super bonus. Your posts are shown X2 times more often, and yes, you collect more engagement.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Content Creation for X/Twitter&lt;/p&gt;

&lt;p&gt;Ofcource better make content manully, you can write content manually. But since it’s 2024, let’s optimize this process a bit and add AI to your hands.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frhpsnrdv0ke5ptyqtofk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frhpsnrdv0ke5ptyqtofk.png" alt="twitter marketing tools" width="800" height="401"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;a href="https://answerim.com/" rel="noopener noreferrer"&gt;Answerim&lt;/a&gt;&amp;nbsp;— Helps answer relevant high quality tweets using AI. Works like this: add your product, brand, or site. The system does a scoring of your product using AI. You set a theme through keywords, the system finds relevant tweets or topics worth commenting on. There’s an auto-commenting button that allows automatic AI commenting on posts and threads. Works very cool. But I recommend monitoring responses to understand which AI wrote good ones and which bad ones to correct them.&lt;/li&gt;
&lt;li&gt; &lt;a href="https://tweethunter.io/" rel="noopener noreferrer"&gt;Twitter Hunter&lt;/a&gt;&amp;nbsp;— A cool tool that finds the most popular tweets on your needed theme. Does a rewrite through AI and publishes under your name, really works. But I recommend mixing with real posts and, for example, Answerim, so it doesn’t look like your account is run by AI alone.&lt;/li&gt;
&lt;li&gt; &lt;a href="https://typefully.com/" rel="noopener noreferrer"&gt;typefully&lt;/a&gt;&amp;nbsp;— Essentially a complete content management system for X/Twitter. You can create posts, edit them with AI of course. Create threads, schedule posts, scheduling system. All this reasonably costs money, from $15 per month. Can you do this in Google Docs? Of course, but it’s not sexy. And Typefully is sexy.&lt;/li&gt;
&lt;li&gt; &lt;a href="https://viralexamples.co/" rel="noopener noreferrer"&gt;ViralExamples&lt;/a&gt;&amp;nbsp;—&amp;nbsp;an extreeemely useful newsletter about what content to write to go viral. I really highly recommend it, it’s a must-have. There are many tools that collect tweets and select relevant by topics.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;X/Twitter Advertising — post promotion&lt;/p&gt;

&lt;p&gt;The main problem with buying X/Twitter ads today is still bots. Many who write about X/Twitter advertising even now complain about the dominance of bots that loose budgets.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;a href="https://business.x.com/en/advertising" rel="noopener noreferrer"&gt;X Advertising Portal&lt;/a&gt;&amp;nbsp;— The official X/Twitter advertising cabinet what helps you find a target audience. After Elon bought it, many things changed. It became easier to set up ads, new formats appeared. The main advantage is you can start with $50 per day, no need to immediately invest thousands. Targeting here is weaker than Facebook, but the audience is more solvent.&lt;/li&gt;
&lt;li&gt; &lt;a href="https://business.x.com/en/help/campaign-setup/quick-promote" rel="noopener noreferrer"&gt;Quick Promote&lt;/a&gt;&amp;nbsp;— This is just a button in X/Twitter interface. The simplest way to promote a tweet. Directly from the interface, you can choose a post and throw a budget at it. No complex settings, everything is simple and fast. Ideal for tests.&lt;/li&gt;
&lt;li&gt; &lt;a href="https://upvote.club/" rel="noopener noreferrer"&gt;Upvote.club&lt;/a&gt;&amp;nbsp;–&amp;nbsp;works similar to X/Twitter advertising. You need to create a tweet and order the reactions you want for it. The difference is that advertising will show your tweet where needed and people will give reactions and your audience will grow, while here your tweet will be liked, followed etc. and your audience will grow from that.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Twitter Analytics&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fis4d7omt3ridd3nmxyxc.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fis4d7omt3ridd3nmxyxc.jpeg" alt="twitter marketing tools" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;a href="https://github.com/eleurent/twitter-graph" rel="noopener noreferrer"&gt;Twitter Graph&lt;/a&gt;&amp;nbsp;— A GitHub library that does an incredible thing: you throw in any account and get and it shows you variety of people: old friends, work colleagues, funny accounts, etc. Gradually, my timeline has become this messy mix that makes X/Twitter so enjoyable.&lt;/li&gt;
&lt;li&gt; &lt;a href="https://x.com/login?redirect_after_login=https%3A%2F%2Fanalytics.twitter.com%2Fuser%2Fhome" rel="noopener noreferrer"&gt;TwitterAnalytics&lt;/a&gt;&amp;nbsp;— Built-in X/Twitter analytics, shows basic metrics: reach, engagement, subscriber growth. Free and good for start, but functionality is limited. But you blue checkmark&lt;/li&gt;
&lt;li&gt; &lt;a href="https://chromewebstore.google.com/detail/social-blade/cfidkbgamfhdgmedldkagjopnbobdmdn" rel="noopener noreferrer"&gt;SocialBlade&lt;/a&gt;&amp;nbsp;— Top service for analytics, shows growth dynamics, compares with competitors, gives insights on the best posting time. Costs from $30 per month, but really helps understand what works and what doesn’t.&lt;/li&gt;
&lt;li&gt; &lt;a href="https://followerwonk.com/" rel="noopener noreferrer"&gt;Followerwonk&lt;/a&gt;&amp;nbsp;— Cool thing for subscriber analysis. Shows demographics, interests, when they are most active. Helps understand your audience and adjust content for them.&lt;/li&gt;
&lt;li&gt; &lt;a href="https://www.tweetbinder.com/" rel="noopener noreferrer"&gt;Tweet Binder&lt;/a&gt;&amp;nbsp;— cool tool for analyzing hashtags and trends. You can track any hashtag, see who writes about it the most, what’s the reach, and when activity peaks. Helps understand which hashtags actually work and which are just noise.&lt;/li&gt;
&lt;li&gt; &lt;a href="https://fedica.com/" rel="noopener noreferrer"&gt;Fedica&lt;/a&gt;&amp;nbsp;— visualizes your followers’ geography on a map. Seems simple, but really helps understand where your main audience is and when it’s better to post content. It can also analyze the best posting time based on your followers’ time zones.&lt;/li&gt;
&lt;li&gt; &lt;a href="https://www.twitonomy.com/" rel="noopener noreferrer"&gt;Twitonomy&lt;/a&gt;&amp;nbsp;— provides super detailed analytics for your tweets. Shows which words get more engagement, who your most active followers are, how often you use links/images and how this affects reach. Has a free plan, but with limitations.&lt;/li&gt;
&lt;li&gt; &lt;a href="https://www.trendsmap.com/" rel="noopener noreferrer"&gt;Trendsmap&lt;/a&gt;&amp;nbsp;— realtime analytics of trends by geolocation. You can see what people are talking about in different cities and countries right now. Perfect for news accounts or if you want to always stay on trend. Paid (from $25 per month), but saves tons of time on searching for current topics.&lt;/li&gt;
&lt;li&gt; &lt;a href="https://blackmagic.so/" rel="noopener noreferrer"&gt;BlackMagic.so&lt;/a&gt;&amp;nbsp;— a cool AI that analyzes your account and suggests what to write to get maximum reach. It can also find trends in your topic area. Expensive (from $50 per month) but really works.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;AI Tools for Twitter&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;a href="https://chromewebstore.google.com/detail/twittergpt-respond-to-twe/nafdjcnfmdcdnebjhehhohfaaffdlkon?hl=en" rel="noopener noreferrer"&gt;TweetGPT&lt;/a&gt;&amp;nbsp;— integrates directly into X/Twitter’s interface, helps generate post ideas and even write them. Runs on GPT-4, so the content quality is decent. Has a free plan, but with limitations.&lt;/li&gt;
&lt;li&gt; &lt;a href="https://answerim.com/" rel="noopener noreferrer"&gt;Answerim&lt;/a&gt;&amp;nbsp;— Helps answer relevant tweets using AI. Works like this: add your product, brand, or site. The system does a scoring of your product using AI. You set a theme through keywords, the system finds relevant tweets or topics worth commenting on. There’s an auto-commenting button that allows automatic AI commenting on posts and threads. Works very cool. But I recommend monitoring responses to understand which AI wrote good ones and which bad ones to correct them.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Huge list of Ai services for twitter:&lt;/p&gt;

&lt;p&gt;Most Effective Grow X/Twitter Strategy in 2024&lt;/p&gt;

&lt;p&gt;I spent 4 weeks talking with influencer marketing agencies, and 9 out of 10 told me that they support each post their influencers publish with likes, comments, reposts, save etc. Within the first hour. They go all-in on the post as an agency. They call it&amp;nbsp;golden hour strategy.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://x.com/natiakourdadze/status/1835711873452548503" rel="noopener noreferrer"&gt;Also, I found a&amp;nbsp;tweet by Natia Kurdadze&lt;/a&gt;&amp;nbsp;where she mentions that X Blue gives a 2x boost to posts on an account, while: Likes give a 30x boost, Comments give a 50x boost, Reposts give a 20x boost, Visual content gives a 2x boost&lt;/p&gt;

&lt;p&gt;Golden strategy&amp;nbsp;to&amp;nbsp;grow your audience [step-by-step guide]&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Get the blue checkmark — this is the base to grow your audience&lt;/li&gt;
&lt;li&gt; Choose the theme you want to write about — for example, marketing. Dive into this theme in Twitter Hunter.&lt;/li&gt;
&lt;li&gt; Create a content mix: 40% your unique content, 30% through AI (like TweetGPT), 30% replies in other threads via Answerim. Do not forget create a tweets threads it’s working.&lt;/li&gt;
&lt;li&gt; For a quick start, use upvote.club to gain initial engagement. Throw every post you create there&lt;/li&gt;
&lt;li&gt; Analyze through SocialBlade what worked, what didn’t&lt;/li&gt;
&lt;li&gt; For well-performing posts, pour more engagement through upvote.club. Buy all actions: like, share, repost, comment&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 With this scheme, you need 3–4 months to build up to the first 10k subscribers on X/Twitter.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The main thing — don’t chase the number of subscribers, but work on content quality and engagement. X/Twitter in 2024 is not about mass following, but about creating a community around your expertise.&lt;/p&gt;

&lt;p&gt;P.S. If I forgot some service, write to me in the comments.&lt;/p&gt;

&lt;p&gt;If you like this article please give a clap 👏&lt;/p&gt;

</description>
      <category>marketing</category>
      <category>socialmedia</category>
      <category>twitter</category>
      <category>productivity</category>
    </item>
    <item>
      <title>ASK: how do you feel about starting selling github repo?</title>
      <dc:creator>Deal Breaker</dc:creator>
      <pubDate>Mon, 04 Oct 2021 15:15:25 +0000</pubDate>
      <link>https://dev.to/dealbreaker/ask-how-do-you-feel-about-starting-selling-github-repo-3j4o</link>
      <guid>https://dev.to/dealbreaker/ask-how-do-you-feel-about-starting-selling-github-repo-3j4o</guid>
      <description>&lt;p&gt;Hello to dev.to community. We are improve our marketplace &lt;a href="//code.market"&gt;code.market&lt;/a&gt; step-by-step, and now we wannа give to developer option: &lt;/p&gt;

&lt;p&gt;&lt;em&gt;Selling private github repository via our platform&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This is a little bit custdev:&lt;/em&gt; Would this option be useful or not? I would love catch your detailed answer in the comments. &lt;/p&gt;

&lt;p&gt;Thank you 🙏&lt;/p&gt;

</description>
      <category>github</category>
      <category>startup</category>
      <category>webdev</category>
      <category>discuss</category>
    </item>
  </channel>
</rss>
