<?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: Cristian Tala</title>
    <description>The latest articles on DEV Community by Cristian Tala (@cristiantalasanchez).</description>
    <link>https://dev.to/cristiantalasanchez</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%2F3820428%2Fa2ac251a-96f5-4902-8bba-077e3d57cd17.jpg</url>
      <title>DEV Community: Cristian Tala</title>
      <link>https://dev.to/cristiantalasanchez</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/cristiantalasanchez"/>
    <language>en</language>
    <item>
      <title>The US is pushing the world toward Chinese AI (its own goal)</title>
      <dc:creator>Cristian Tala</dc:creator>
      <pubDate>Mon, 29 Jun 2026 20:30:56 +0000</pubDate>
      <link>https://dev.to/cristiantalasanchez/the-us-is-pushing-the-world-toward-chinese-ai-its-own-goal-19e4</link>
      <guid>https://dev.to/cristiantalasanchez/the-us-is-pushing-the-world-toward-chinese-ai-its-own-goal-19e4</guid>
      <description>&lt;p&gt;In June 2026, the United States put a lock on its own AI models. It ordered Anthropic to block access to Mythos 5 and Fable 5 for anyone who isn't American, and days later it asked OpenAI to limit the rollout of GPT 5.6 to a handful of government-approved partners. Its best models, the newest ones, were placed out of reach for the rest of the world.&lt;/p&gt;

&lt;p&gt;That adds to something older: years of restrictions that already left Nvidia almost out of China's chip market. Two brakes, one new and one accumulated, with the same effect. And the effect isn't the one Washington was after: demand, money and talent ran toward Chinese AI.&lt;/p&gt;

&lt;p&gt;I live this firsthand. I'm a founder in Chile, I can't use the newest from Anthropic or OpenAI, and my stack leans more and more on Chinese models like GLM and DeepSeek. This isn't ideology. It's what's left when they close the door on you.&lt;/p&gt;

&lt;h2&gt;
  
  
  What exactly did the United States block?
&lt;/h2&gt;

&lt;p&gt;Two different brakes that ended up coinciding.&lt;/p&gt;

&lt;p&gt;The first, the models, and it's from this month. In mid-June 2026, the US government ordered Anthropic to block access by non-Americans to Mythos 5 and Fable 5, its most powerful models. The official reason was national security, after suspicion that a China-linked group had accessed one of them. Anthropic suspended them worldwide to comply, and the Commerce Department lifted the restriction only for a short list of American companies.&lt;/p&gt;

&lt;p&gt;Days later it was OpenAI's turn. The administration asked it to limit the rollout of GPT 5.6 to a small number of partners approved by the government itself, over its cybersecurity capabilities, which it considers equivalent to Mythos's. Sam Altman called it a "strange moment," with no clear rules, and accepted the condition to be able to launch the model. So it wasn't an isolated case: the two US leaders, Anthropic and OpenAI, ended up with their best technology under government control. When the owners of the frontier have to ask permission to hand out what they build, the rest of the world looks elsewhere.&lt;/p&gt;

&lt;p&gt;The second brake, the hardware, isn't from June: it's a policy that's been tightening for years. The US has restricted the sale of Nvidia's AI chips to China since 2022, turn after turn. The state of things in 2026 is the most extreme, with an ironic twist: early in the year the government loosened up to let the H200 in, but by then China had already told its own companies not to buy the H20 or the H200, on security grounds. Nvidia ended up practically out of that market, squeezed from both shores. An analysis by &lt;a href="https://www.brookings.edu/articles/ball-games-over-the-us-is-out-of-the-ai-chip-market-in-china/" rel="noopener noreferrer"&gt;Brookings&lt;/a&gt; puts it bluntly: the game's over, the US is out of the AI chip market in China.&lt;/p&gt;

&lt;h2&gt;
  
  
  The world runs to Chinese AI
&lt;/h2&gt;

&lt;p&gt;When you take the best Western model away from the world, the world doesn't sit and wait. It moves to the next one. And the next one, today, is Chinese and open.&lt;/p&gt;

&lt;p&gt;The clearest signal: shares of Z.ai, the company behind GLM, jumped more than 30% after it released its new open source model. Global demand shifted toward the Chinese alternatives, cheaper and with no access restrictions. It's no accident that right now half the internet talks about &lt;a href="https://cristiantala.com/modelos-ia-open-source-gratis-mito/" rel="noopener noreferrer"&gt;GLM 5.2 as if it were free&lt;/a&gt;: the block opened the door for it.&lt;/p&gt;

&lt;p&gt;And it's not just that they're available. They're much cheaper. DeepSeek had already shown you can build a top-tier model for a fraction of what American labs spend, and that gap carries over to the price per use. For a founder counting every dollar, an open, accessible and cheap model stopped being plan B. It's the plan A that Washington made obvious.&lt;/p&gt;

&lt;p&gt;I'm part of that statistic. As a founder outside the United States, I'm not on the list that can use the newest from Anthropic. So I test, I measure, and I use what I do have available, and a lot of it comes from China. In my &lt;a href="https://cristiantala.com/benchmark-de-modelos-de-ia-2026-probe-25-modelos-con-125-tests-reales/" rel="noopener noreferrer"&gt;AI model benchmark&lt;/a&gt;, DeepSeek and the Chinese models fight for the top spots. I don't pick them by flag. By access and by result.&lt;/p&gt;

&lt;h2&gt;
  
  
  And China stopped needing Nvidia
&lt;/h2&gt;

&lt;p&gt;Here's the part that should worry Washington more than any other.&lt;/p&gt;

&lt;p&gt;Blocking the chip didn't stop China. It pushed it to make its own. Analysts estimate that the export cap alone could increase China's domestic compute capacity by 250%. Huawei plans to ship 600,000 of its Ascend 910C chips in 2026, no matter what the US decides.&lt;/p&gt;

&lt;p&gt;And it's no longer theory. Huawei leads the AI chip market inside China, where it beat Nvidia, and it's projected to control 60% of that market by the end of 2026, with revenue over 12 billion dollars. Its Ascend 950 series is comparable to the H200, one of Nvidia's most powerful chips. And DeepSeek's V4 model has already been adapted to run on Huawei's chips: a full stack, a Chinese model on Chinese hardware, with no stop in the United States.&lt;/p&gt;

&lt;p&gt;The honest caveat: the individual chip is still behind. The Ascend 910C performs at around 60% of an H100, and China still depends on manufacturing equipment it doesn't fully produce at home. But the direction is clear, and so is the speed. When someone with resources has no other choice, they build. And they improve fast.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this is an own goal
&lt;/h2&gt;

&lt;p&gt;The logic of the block is intuitive: take the best technology from your rival and you leave them behind. It works when the rival can't build the substitute. China can.&lt;/p&gt;

&lt;p&gt;Every restriction did the opposite of what it promised. The model block sent the world to try the Chinese ones. The chip block handed Huawei a captive market of hundreds of thousands of units and a national reason to accelerate. The United States didn't stop China. It funded its independence.&lt;/p&gt;

&lt;p&gt;It's an old lesson, and it's not geopolitics, it's business: when you close the door on someone with resources and pride, you don't stop them. You force them to build their own house. And sometimes they build it better than yours.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this means for you, founder
&lt;/h2&gt;

&lt;p&gt;Let's bring this down to earth, because what matters to you is what you build with.&lt;/p&gt;

&lt;p&gt;First: your stack can't depend on a single provider. If you depend on one model and tomorrow a political decision cuts your access, you're left without operations. Mine is split across several models on purpose, and that stopped being a technical preference to become insurance.&lt;/p&gt;

&lt;p&gt;Second: Chinese AI is part of the map, like it or not. GLM and DeepSeek are among the most capable and cheapest models out there today. Ignoring them by flag is competing with one hand tied.&lt;/p&gt;

&lt;p&gt;Third, and that's why it's not blind faith: Chinese models come with their own fine print. It matters where your data is processed, what's stored and what's censored. I use them with judgment, for the right tasks, not for everything. Just like with any provider, the question isn't what country it's from, but what it does with what you give it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The day the best model and the best chip come from the same place
&lt;/h2&gt;

&lt;p&gt;The United States wanted to buy time and ended up giving away ground. For the founder on the outside, the takeaway is simple and a little uncomfortable: the future of your stack is no longer decided by Silicon Valley alone.&lt;/p&gt;

&lt;p&gt;Test the Chinese models with the same coldness you'd test any other: by capability, by cost, by where your data goes. And don't take your eyes off the hardware. Today the Chinese chip is behind; in a year or two, that sentence may stop being true. The day the best model and the best chip come from the same place, and that place isn't the United States, the block will have achieved exactly the opposite of what it set out to do.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;I write about AI and test models at &lt;a href="https://cristiantala.com/" rel="noopener noreferrer"&gt;cristiantala.com&lt;/a&gt;. Every month I publish a &lt;a href="https://benchmarks.cristiantala.com/" rel="noopener noreferrer"&gt;benchmark of 89 models&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>china</category>
      <category>opensource</category>
      <category>geopolitics</category>
    </item>
    <item>
      <title>GLM 5.2 isn't free: not even my US$4,000 Spark can run it</title>
      <dc:creator>Cristian Tala</dc:creator>
      <pubDate>Mon, 29 Jun 2026 20:30:55 +0000</pubDate>
      <link>https://dev.to/cristiantalasanchez/glm-52-isnt-free-not-even-my-us4000-spark-can-run-it-3464</link>
      <guid>https://dev.to/cristiantalasanchez/glm-52-isnt-free-not-even-my-us4000-spark-can-run-it-3464</guid>
      <description>&lt;p&gt;GLM 5.2 is open source and free to download. Running it is another story. At best it needs around 240 GB of memory, and that's only in its most compressed version. I have a US$4,000 DGX Spark dedicated to this, with 128 GB, and it doesn't have enough to even start. This isn't opinion, it's arithmetic. What bothers me isn't the model. It's the smoke from people shouting "free" who never opened a terminal.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why does everyone say GLM 5.2 is free?
&lt;/h2&gt;

&lt;p&gt;Because they mix up two different things. One is the license. GLM 5.2 shipped under the MIT license on June 13, 2026: anyone can download the weights, no payment, no permission. That's real and it's great.&lt;/p&gt;

&lt;p&gt;The other is the cost of using it. Downloading the model costs nothing. Making it run at a usable speed costs money, and a lot of it. Both facts coexist, but the posts you see only tell you the first one. "Open weights under MIT" doesn't pull as many likes as "it's free and it beats the paid model."&lt;/p&gt;

&lt;h2&gt;
  
  
  What's the best free AI? The question is wrong
&lt;/h2&gt;

&lt;p&gt;It's the search everyone makes, so I'll answer it straight: the best open source AI today (GLM 5.2, DeepSeek, the big Qwens) isn't free to run for almost anyone. The word "free" assumes you already have somewhere to run it. That's the trap.&lt;/p&gt;

&lt;p&gt;The open source models that compete with the paid ones are huge. They don't run on your laptop. They run on a tiny fraction of the computers that exist in the world. The small model that does fit on your machine isn't the one you saw winning the rankings.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it really costs to run GLM 5.2
&lt;/h2&gt;

&lt;p&gt;GLM 5.2 is a mixture-of-experts model with around 750 billion parameters. What it costs to run depends on two things: how much you compress it (and how much quality you give up) and how fast you want it. Here's the real map:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Version&lt;/th&gt;
&lt;th&gt;Memory&lt;/th&gt;
&lt;th&gt;Typical hardware&lt;/th&gt;
&lt;th&gt;Approx. cost&lt;/th&gt;
&lt;th&gt;Speed&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;FP16&lt;/strong&gt; (full, no quality loss)&lt;/td&gt;
&lt;td&gt;~1,642 GB&lt;/td&gt;
&lt;td&gt;2-3 DGX servers (16-24 GPUs)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;US$500,000 to 1M+&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;like a provider&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;4-bit&lt;/strong&gt; (decent, near-full quality)&lt;/td&gt;
&lt;td&gt;~411 GB&lt;/td&gt;
&lt;td&gt;several datacenter GPUs&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~US$150,000&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;good&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;2-bit&lt;/strong&gt; (minimum usable, degraded quality)&lt;/td&gt;
&lt;td&gt;~240 GB&lt;/td&gt;
&lt;td&gt;Mac Studio 256 GB or 4× RTX 4090 rig&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~US$10,000&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;3-6 tokens/s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Doesn't fit&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;128 GB&lt;/td&gt;
&lt;td&gt;DGX Spark&lt;/td&gt;
&lt;td&gt;US$4,000&lt;/td&gt;
&lt;td&gt;won't run&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Read it from the bottom up. My US$4,000 Spark, bought precisely for this, doesn't even reach the minimum: GLM 5.2 needs 240 GB and it has 128. It doesn't even fit.&lt;/p&gt;

&lt;p&gt;The first rung where the model runs is a US$10,000 Mac, compressed to 2-bit (quality drops) and at 3 to 6 tokens per second. At that speed you type faster than the model. To have it decent and fast you're already in six figures. And to run it the way a provider hands it to you (OpenRouter, Nvidia NIM and friends), at full precision, you're at two or three DGX servers and up to a million dollars.&lt;/p&gt;

&lt;p&gt;And that's just buying the gear. It doesn't include the electricity bill of keeping it on, or that in a few months a bigger model ships and your investment falls short, or your hours maintaining all of it. The provider spreads that datacenter cost across thousands of users and charges you fractions of a dollar per million tokens. You'd pay it whole, just for you, with the machine off most of the day.&lt;/p&gt;

&lt;h2&gt;
  
  
  DeepSeek, Qwen, GLM: "free" is marketing
&lt;/h2&gt;

&lt;p&gt;The pattern repeats with every launch. An open source model that fights the paid ones drops, and the next day half the internet announces that top-tier AI is now free. DeepSeek went through this. The big Qwens too.&lt;/p&gt;

&lt;p&gt;The part that doesn't make it into the video: to run those models at a usable speed, you need a hardware investment that pays for several years of an API subscription on its own. The open license doesn't save you that cost. It just changes who pays it. Instead of the model provider, you pay it, in gear.&lt;/p&gt;

&lt;p&gt;The pattern shows up in dozens of posts from creators talking about models they never ran. The formula is always the same: an epic image, a vault swinging open and the model flowing out toward a desktop computer, and a headline like "the best coding model is no longer rented, it's open source." Sounds incredible. It has two problems. First: that desktop computer with one graphics card doesn't run GLM 5.2, not even close. The image draws something that can't be done. Second: "no longer rented" is exactly backwards. You keep renting it through an API, because you have nowhere to run it. The vault opened, yes, but inside there's something that only fits in a US$12,000 machine. Open isn't the same as accessible. For most people, that "freed" model stays as far away as the paid closed one.&lt;/p&gt;

&lt;h2&gt;
  
  
  So what do I run locally? And for what
&lt;/h2&gt;

&lt;p&gt;I'm not talking about this from the outside. I use open source models every day, in my operation and my work. On the Spark I run &lt;a href="https://cristiantala.com/gemma-4-google-guia-completa/" rel="noopener noreferrer"&gt;Gemma 4&lt;/a&gt; and Qwen 3.6, smaller models that do fit. They work well. But because of memory bandwidth, the tokens per second aren't enough to use them in a live conversation.&lt;/p&gt;

&lt;p&gt;So I give them the work where speed doesn't matter: my agents, processes I leave running overnight, and my own &lt;a href="https://cristiantala.com/benchmark-de-modelos-de-ia-2026-probe-25-modelos-con-125-tests-reales/" rel="noopener noreferrer"&gt;AI model benchmark&lt;/a&gt;. For that they're perfect and I pay no API.&lt;/p&gt;

&lt;p&gt;And when I need an open source model with real speed (almost all my n8n automations), I run it through an API on Ollama Cloud. Open source, yes. Free, no. That's the point that gets lost: open source doesn't mean you don't pay. It means you choose where you pay, between your own hardware or an API. Same when I use &lt;a href="https://cristiantala.com/claude-code-cualquier-llm-guia-2026/" rel="noopener noreferrer"&gt;Claude Code connected to open source models&lt;/a&gt;: the model is open, someone provides the compute and someone pays for it.&lt;/p&gt;

&lt;h2&gt;
  
  
  When does running a model locally actually make sense?
&lt;/h2&gt;

&lt;p&gt;When the reason is your data, not your wallet. If you handle sensitive information and you don't want it leaving your machine, running the model at home makes all the sense in the world. Privacy and control are the honest argument for self-hosting. Savings aren't. When someone sells you local because it's cheap, be suspicious. When they sell it to you for privacy, listen. That's the filter.&lt;/p&gt;

&lt;h2&gt;
  
  
  The final proof is in the OpenRouter ranking
&lt;/h2&gt;

&lt;p&gt;If running GLM 5.2 free at home were practical, nobody would pay to use it. Look at the &lt;a href="https://openrouter.ai/rankings" rel="noopener noreferrer"&gt;OpenRouter usage ranking&lt;/a&gt;: GLM 5.2 is among the most-used models on the platform at the end of June 2026. And OpenRouter is a paid service, where you call the model through an API and they charge you per token.&lt;/p&gt;

&lt;p&gt;In other words: even the people who love GLM 5.2 use it paying. Because that's what makes sense. The model is excellent. "Free" is the made-up part.&lt;/p&gt;

&lt;h2&gt;
  
  
  Before you share the next "it's free"
&lt;/h2&gt;

&lt;p&gt;Let me be clear: I'm glad open source is this good. That's why I have the Spark, that's why I test every model that ships, that's why my stack is split across several models depending on the task. This isn't against open source. It's against the smoke.&lt;/p&gt;

&lt;p&gt;Next time you see "this model is free and it beats the paid one," ask yourself two questions before hitting share: how much does the computer that runs it at a usable speed cost?, and do I need it answering live or does it work for me running overnight? With those two answers you decide for real, with your case and your budget. Not with the excitement of someone who never opened a terminal.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;I write about AI and test models at &lt;a href="https://cristiantala.com/" rel="noopener noreferrer"&gt;cristiantala.com&lt;/a&gt;. Every month I publish a &lt;a href="https://benchmarks.cristiantala.com/" rel="noopener noreferrer"&gt;benchmark of 89 models&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>llm</category>
      <category>machinelearning</category>
    </item>
    <item>
      <title>How I Export 700+ Skool Members to CSV with One API Call (Email, Tier, LTV, Survey)</title>
      <dc:creator>Cristian Tala</dc:creator>
      <pubDate>Fri, 29 May 2026 14:45:24 +0000</pubDate>
      <link>https://dev.to/cristiantalasanchez/how-i-export-700-skool-members-to-csv-with-one-api-call-email-tier-ltv-survey-1p85</link>
      <guid>https://dev.to/cristiantalasanchez/how-i-export-700-skool-members-to-csv-with-one-api-call-email-tier-ltv-survey-1p85</guid>
      <description>&lt;p&gt;If you run a community on Skool, you've probably noticed something annoying about the member list: the email field is blank for most members. Not your bug. Skool's server-rendered member list returns &lt;code&gt;email: ""&lt;/code&gt; for everyone except the authenticated user. Even community owners get masked emails for third parties when calling &lt;code&gt;GET /users/{id}&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The admin panel has an "Export" button that &lt;em&gt;does&lt;/em&gt; give you everything — emails, tiers, LTV, survey answers — but only if you click it manually. For a CRM sync pipeline, that's not enough.&lt;/p&gt;

&lt;p&gt;This post shows how to &lt;strong&gt;call that same export programmatically&lt;/strong&gt; via the Skool All-in-One API actor on Apify. One HTTP request, full member roster as JSON, ready to pipe into NocoDB / Airtable / Postgres / anywhere.&lt;/p&gt;

&lt;p&gt;It's the foundation of the CRM single-source-of-truth pipeline I run for &lt;a href="https://www.skool.com/cagala-aprende-repite" rel="noopener noreferrer"&gt;Cágala, Aprende, Repite&lt;/a&gt; (700+ members).&lt;/p&gt;

&lt;h2&gt;
  
  
  What you'll need
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;An &lt;a href="https://console.apify.com/sign-up?fpr=cristian" rel="noopener noreferrer"&gt;Apify account&lt;/a&gt; (free tier covers this — the export costs ~$0.05/run)&lt;/li&gt;
&lt;li&gt;Skool admin/owner cookies for your community&lt;/li&gt;
&lt;li&gt;A community where you're admin (export is admin-only)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you've never used the actor before: it wraps Skool's entire REST surface so you don't have to handle cookies, WAF token rotation, weekly &lt;code&gt;buildId&lt;/code&gt; changes, or the 3-step async pattern Skool's export uses internally. One JSON POST → parsed response.&lt;/p&gt;

&lt;h2&gt;
  
  
  The one-liner that returns your full roster
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s2"&gt;"https://api.apify.com/v2/acts/cristiantala~skool-all-in-one-api/run-sync-get-dataset-items?token=&lt;/span&gt;&lt;span class="nv"&gt;$APIFY_TOKEN&lt;/span&gt;&lt;span class="s2"&gt;&amp;amp;timeout=60&amp;amp;build=latest"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
    "action": "members:export",
    "cookies": "auth_token=...; client_id=...; aws-waf-token=...",
    "groupSlug": "your-community",
    "params": { "status": "active" }
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Response (one item per member, already parsed — no CSV parsing on your side):&lt;br&gt;
&lt;/p&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="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"firstName"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Maria"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"lastName"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Lopez"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"maria@example.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;"invitedBy"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Cristian Tala"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"joinedDate"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-04-12 18:14:56"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"survey"&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="nl"&gt;"question"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"What's your LinkedIn?"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"answer"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"linkedin.com/in/marialopez"&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="nl"&gt;"question"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"What are you building?"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"answer"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"SaaS for restaurants"&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="nl"&gt;"question"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"How did you find us?"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"answer"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Newsletter"&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="nl"&gt;"tier"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"standard"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"ltv"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"$0"&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;p&gt;The actor handles the underlying 3-step flow Skool's admin UI runs when you click Export:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;POST /groups/{id}/request-bulk-action?type=bulk-export-csv&lt;/code&gt; → returns &lt;code&gt;{token, file_id}&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;GET /wait?token={token}&lt;/code&gt; → polls until &lt;code&gt;completed&lt;/code&gt; (2-8 sec typically)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;POST /files/{file_id}/download-url&lt;/code&gt; → signed CloudFront URL → GET that → CSV body → parse to JSON&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You don't see any of that. One call in, parsed JSON out.&lt;/p&gt;

&lt;h2&gt;
  
  
  Filter what you export
&lt;/h2&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;"params"&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;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"active"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"tiers"&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="s2"&gt;"premium"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"vip"&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;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Param&lt;/th&gt;
&lt;th&gt;Values&lt;/th&gt;
&lt;th&gt;Default&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;active&lt;/code&gt; / &lt;code&gt;cancelling&lt;/code&gt; / &lt;code&gt;churned&lt;/code&gt; / &lt;code&gt;banned&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;&lt;code&gt;active&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;tiers&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;array of your community's tier slugs&lt;/td&gt;
&lt;td&gt;all tiers&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Useful for cohort analysis: "all premium members who joined in the last 30 days" → filter &lt;code&gt;status: active&lt;/code&gt;, &lt;code&gt;tiers: ["premium"]&lt;/code&gt;, then client-side filter by &lt;code&gt;joinedDate&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The data quality reality nobody mentions
&lt;/h2&gt;

&lt;p&gt;Measured against a real production community of 700+ members:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;~68% of members have a populated &lt;code&gt;email&lt;/code&gt; field.&lt;/strong&gt; The other ~32% (typically members who joined via the Skool Discovery network — the platform's "browse communities" feature) don't share their email with the community owner. Skool keeps that field empty in the export. This is structural, not a bug.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;~88% have a LinkedIn URL&lt;/strong&gt; in their first survey answer (when the apply form asks for it). Apply-form answers are far more complete than the email field.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;invitedBy&lt;/code&gt; is empty unless the member came through a tracked &lt;a href="https://www.skool.com/help" rel="noopener noreferrer"&gt;Skool referral link&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For the ~32% with no email, fall back to the LinkedIn URL from the survey. That's typically enough to identify the member for outreach.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the export does NOT include
&lt;/h2&gt;

&lt;p&gt;One important gap: &lt;strong&gt;the acquisition source&lt;/strong&gt; (&lt;code&gt;Joined from LinkedIn&lt;/code&gt; / &lt;code&gt;Joined from your blog&lt;/code&gt; / &lt;code&gt;Joined from Skool network&lt;/code&gt;) is NOT in the export. It lives in &lt;code&gt;member.metadata.attrSrcComp&lt;/code&gt; on the SSR member object — accessed via a separate call:&lt;br&gt;
&lt;/p&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;"action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"members:list"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"cookies"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&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;"groupSlug"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&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;"params"&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;"all"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&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;p&gt;&lt;code&gt;members:list&lt;/code&gt; returns &lt;code&gt;joinedFrom&lt;/code&gt; / &lt;code&gt;joinedVia&lt;/code&gt; per member — the missing piece for attribution analytics. Merge both responses by &lt;code&gt;memberId&lt;/code&gt; if you need the full picture.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pipe straight to your CRM
&lt;/h2&gt;

&lt;p&gt;Two production patterns I use:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A. Nightly snapshot → NocoDB.&lt;/strong&gt; Cron runs the export, diffs against yesterday's, upserts into a &lt;code&gt;personas&lt;/code&gt; table keyed by email. New rows get &lt;code&gt;joined_at&lt;/code&gt;, missing rows get &lt;code&gt;churned_at&lt;/code&gt;. This is the single-source-of-truth for the CRM.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;B. On-demand cohort pull.&lt;/strong&gt; Export &lt;code&gt;tier: ["premium"]&lt;/code&gt;, filter rows where &lt;code&gt;joinedDate &amp;gt;= 30 days ago&lt;/code&gt;, send each to a personalized email sequence in Postmark. The &lt;code&gt;survey&lt;/code&gt; array gives the personalization data: their LinkedIn, what they're building, where they heard about you.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# JSON snapshot&lt;/span&gt;
curl ... &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; members-&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;date&lt;/span&gt; +%F&lt;span class="si"&gt;)&lt;/span&gt;.json

&lt;span class="c"&gt;# Or convert to CSV with jq&lt;/span&gt;
curl ... | jq &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s1"&gt;'
  (.[0] | [.firstName, .lastName, .email, .joinedDate, .tier, .ltv] | @csv),
  (.[]  | [.firstName, .lastName, .email, .joinedDate, .tier, .ltv] | @csv)
'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; members-&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;date&lt;/span&gt; +%F&lt;span class="si"&gt;)&lt;/span&gt;.csv
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Gotchas I hit so you don't have to
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;build.stale&lt;/code&gt; error = expired cookies, not a bug.&lt;/strong&gt; Skool's &lt;code&gt;aws-waf-token&lt;/code&gt; rotates every ~3.5 days. Re-run &lt;code&gt;auth:login&lt;/code&gt; with email+password to get fresh cookies. The actor returns a clear &lt;code&gt;errorCode: BUILDID_STALE&lt;/code&gt; with the exact JSON payload you need to re-auth.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Don't poll the export every 5 minutes.&lt;/strong&gt; Designed for daily/weekly snapshots. The CSV is generated on-demand by Skool — calling it on every webhook is wasteful and you'll eventually hit rate limits.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Large communities (10K+ members) can take 30+ seconds to generate.&lt;/strong&gt; Set your HTTP client timeout to at least 90 sec.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;invitedBy&lt;/code&gt; is empty unless the member came through a tracked referral.&lt;/strong&gt; All blanks doesn't mean broken — just means no member came through your ref link.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why this actor exists
&lt;/h2&gt;

&lt;p&gt;I run my own Skool community alone — no team, no virtual assistants. Approving members, replying to posts, publishing courses, exporting member data for follow-up. Everything in this actor (and the &lt;a href="https://skool-api.cristiantala.com/recipes/" rel="noopener noreferrer"&gt;20 production recipes&lt;/a&gt; in the docs) exists because &lt;strong&gt;I needed it to keep up with the daily work&lt;/strong&gt; as a solo admin.&lt;/p&gt;

&lt;p&gt;If you're running a Skool community without a team and the manual admin clicks are eating your day, the actor is built for you.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apify.com/cristiantala/skool-all-in-one-api?utm_source=devto&amp;amp;utm_medium=recipe&amp;amp;utm_campaign=export-skool-members-csv&amp;amp;fpr=cristian" rel="noopener noreferrer"&gt;&lt;strong&gt;→ Use the Skool All-in-One API actor on Apify&lt;/strong&gt;&lt;/a&gt; — pay-per-event (~$1.50/mo typical).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://skool-api.cristiantala.com/recipes/export-skool-members-csv/" rel="noopener noreferrer"&gt;&lt;strong&gt;→ Full recipe with all the edge cases&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;New to Skool? &lt;a href="https://www.skool.com/signup?ref=114150f098fc40ba9b365fa78be01a63" rel="noopener noreferrer"&gt;Launch your community here&lt;/a&gt; — 14-day free trial.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>skool</category>
      <category>api</category>
      <category>automation</category>
      <category>aiagents</category>
    </item>
    <item>
      <title>How I Uploaded an 18-Course Classroom to Skool With One Script (and the Bug That Almost Killed My Paywall)</title>
      <dc:creator>Cristian Tala</dc:creator>
      <pubDate>Sun, 17 May 2026 14:43:10 +0000</pubDate>
      <link>https://dev.to/cristiantalasanchez/how-i-uploaded-an-18-course-classroom-to-skool-with-one-script-and-the-bug-that-almost-killed-my-2pi1</link>
      <guid>https://dev.to/cristiantalasanchez/how-i-uploaded-an-18-course-classroom-to-skool-with-one-script-and-the-bug-that-almost-killed-my-2pi1</guid>
      <description>&lt;h1&gt;
  
  
  How I Uploaded an 18-Course Classroom to Skool With One Script (and the Bug That Almost Killed My Paywall)
&lt;/h1&gt;

&lt;p&gt;When I sat down to build the curriculum for my Skool community, I had two options.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Option A:&lt;/strong&gt; open the Skool UI, click &lt;em&gt;New Course&lt;/em&gt;, type the title, drag in a cover image, click &lt;em&gt;Add section&lt;/em&gt;, type the section title, click &lt;em&gt;Add lesson&lt;/em&gt;, type the lesson title, paste the body, fix the formatting Skool's editor mangled, save, repeat. For 18 courses with an average of 12 lessons each.&lt;/p&gt;

&lt;p&gt;That's ~220 manual operations, each in a UI that adds modal friction at every step. Realistic time: a full week of clicking.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Option B:&lt;/strong&gt; structure the curriculum as markdown files in a local directory. Write a script that walks the directory and calls Skool's API to create the courses, folders, lessons, and bodies. Run the script. Drink coffee. Done in two hours.&lt;/p&gt;

&lt;p&gt;I went with Option B. I'd already built &lt;a href="https://apify.com/cristiantala/skool-all-in-one-api?fpr=cristian" rel="noopener noreferrer"&gt;the Skool API actor on Apify&lt;/a&gt; for other automations (member approvals, podcast publishing, comment replies), and the classroom endpoints were already there. The actor wraps Skool's reverse-engineered API with read-then-write semantics, markdown-to-Skool's-internal-format conversion, and structured error handling.&lt;/p&gt;

&lt;p&gt;What I didn't expect was the bug that nearly stripped the paywall off all 12 of my paid courses. We'll get there.&lt;/p&gt;




&lt;h2&gt;
  
  
  What the directory looked like
&lt;/h2&gt;

&lt;p&gt;The whole curriculum lived in one folder structure on my laptop. Each course was a subdirectory; each module was a subdirectory inside that; each lesson was a markdown file. Cover images and the script to regenerate them lived next to each course.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cursos-car/
├── intro-llms-mastermap/
│   ├── M01-el-llm-no-es-oraculo/
│   │   ├── L1.1-el-llm-no-es-oraculo-ni-google.md
│   │   ├── L1.2-tokens-y-ventanas-de-contexto.md
│   │   └── L1.3-el-coste-real-de-tokens-a-dolares.md
│   ├── M02-mapa-de-modelos-2026/
│   ├── M03-framework-de-decision/
│   ├── M04-matchmaking/
│   ├── M05-tu-primer-experimento/
│   └── assets/
│       ├── cover.html         # Tailwind synthwave template
│       ├── cover.jpg          # Playwright-rendered output
│       └── render-cover.mjs   # script to regenerate the JPG
│
├── idea-validation/
│   └── [same structure, 15 lessons across 5 modules]
│
├── podcasts-car/
│   └── [12 lessons in one folder, no modules — flat archive]
│
└── [15 more courses]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each &lt;code&gt;L*.md&lt;/code&gt; file is a self-contained lesson. First line is &lt;code&gt;# Title&lt;/code&gt;. Body is normal markdown with the occasional callout block.&lt;/p&gt;

&lt;p&gt;The build pipeline reads this directory, creates one course on Skool per top-level folder, one Skool &lt;em&gt;section&lt;/em&gt; (folder) per &lt;code&gt;M*-*&lt;/code&gt; subdirectory, and one Skool &lt;em&gt;lesson&lt;/em&gt; per &lt;code&gt;L*.md&lt;/code&gt; file. The body of the lesson is the markdown content converted to Skool's internal TipTap JSON format.&lt;/p&gt;

&lt;p&gt;The whole pipeline is straightforward to describe. It hides four traps. Let me walk you through them.&lt;/p&gt;




&lt;h2&gt;
  
  
  Trap 1: Skool prefixes folders with "Section N:" — don't do it manually
&lt;/h2&gt;

&lt;p&gt;My first pass at the directory naming put the module number in the folder name itself: &lt;code&gt;M01-intro&lt;/code&gt;, &lt;code&gt;M02-mapa-modelos&lt;/code&gt;, etc. The script passed those titles straight through to &lt;code&gt;classroom:createFolder&lt;/code&gt; on Skool.&lt;/p&gt;

&lt;p&gt;Result in the UI: every folder displayed as &lt;strong&gt;"Section 1: M01 — Intro"&lt;/strong&gt;, &lt;strong&gt;"Section 2: M02 — Mapa de Modelos"&lt;/strong&gt;, etc. Double-numbered. Awful.&lt;/p&gt;

&lt;p&gt;Skool prefixes every section in a course with "Section N:" automatically based on its position. If you also number manually in the title, you get the duplication.&lt;/p&gt;

&lt;p&gt;Fix: drop the &lt;code&gt;M01-&lt;/code&gt;, &lt;code&gt;M02-&lt;/code&gt; prefix from the folder titles you pass to the API. Keep the prefix in your local directory names if you want them ordered on disk — just don't pass them to Skool.&lt;/p&gt;

&lt;p&gt;Now my titles are just &lt;code&gt;🧱 El LLM no es un Oráculo&lt;/code&gt;, &lt;code&gt;🗺️ Mapa de Modelos 2026&lt;/code&gt;, etc. Skool renders them as &lt;code&gt;Section 1: 🧱 El LLM no es un Oráculo&lt;/code&gt;, which is what I wanted.&lt;/p&gt;




&lt;h2&gt;
  
  
  Trap 2: &lt;code&gt;classroom:updateCourse&lt;/code&gt; silently resets &lt;code&gt;privacy&lt;/code&gt; to 0
&lt;/h2&gt;

&lt;p&gt;This is the one that almost cost me real money.&lt;/p&gt;

&lt;p&gt;A few weeks into running the pipeline, I needed to update the description on a few courses. Trivial — &lt;code&gt;classroom:updateCourse&lt;/code&gt; with the new &lt;code&gt;desc&lt;/code&gt; field. Worked fine.&lt;/p&gt;

&lt;p&gt;Until I checked the courses in the Skool UI and noticed the lock icons had disappeared. Twelve paid courses were now showing as &lt;strong&gt;Open&lt;/strong&gt; (free) to all members. The Premium tier I'd set was wiped. &lt;code&gt;amount: 147&lt;/code&gt; was now &lt;code&gt;amount: 0&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;What happened: Skool's &lt;code&gt;PUT /courses/{courseId}&lt;/code&gt; endpoint is a &lt;em&gt;replace&lt;/em&gt;, not a &lt;em&gt;merge&lt;/em&gt;. If you omit a field in the body, Skool doesn't preserve it from the existing record — it resets it to the default. &lt;code&gt;privacy&lt;/code&gt; defaults to &lt;code&gt;0&lt;/code&gt; (Open). &lt;code&gt;amount&lt;/code&gt; defaults to &lt;code&gt;0&lt;/code&gt;. &lt;code&gt;minTier&lt;/code&gt; happens to be preserved (because it's an integer with no default that fits "I omitted this"), but &lt;code&gt;privacy&lt;/code&gt; and &lt;code&gt;amount&lt;/code&gt; are not.&lt;/p&gt;

&lt;p&gt;The actor now does &lt;code&gt;updateCourse&lt;/code&gt; as &lt;strong&gt;read-then-write internally&lt;/strong&gt;. It fetches the current course state, merges your input on top, sends the full body. Cost: +1 GET (~200ms per update). Worth every millisecond.&lt;/p&gt;

&lt;p&gt;But the day I figured this out, I had to fix twelve courses by hand in the UI before any paying member noticed they had free access to everything.&lt;/p&gt;

&lt;p&gt;If you build any automation against Skool's classroom endpoints, &lt;strong&gt;never&lt;/strong&gt; send a partial PUT. Always read the current state first, merge, and write the full body. The actor handles this for &lt;code&gt;updateCourse&lt;/code&gt;. If you call the Skool API directly: read-then-write everywhere, no exceptions.&lt;/p&gt;




&lt;h2&gt;
  
  
  Trap 3: Markdown converter quirks
&lt;/h2&gt;

&lt;p&gt;The actor accepts markdown for lesson bodies and converts it to Skool's internal &lt;code&gt;[v2]&amp;lt;JSON_array&amp;gt;&lt;/code&gt; TipTap format. The conversion is mostly faithful, but a few things bit me when my source markdown wasn't strict.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Brackets without URLs become plain text.&lt;/strong&gt; A line like &lt;code&gt;[Read more] - in this guide&lt;/code&gt; is &lt;em&gt;not&lt;/em&gt; valid markdown link syntax (no parentheses with URL). Most renderers tolerate it. Skool's converter respects the spec — it stays as literal text with brackets visible. Audit your "For more reading" sections before publish. This bit me three times in lessons generated by an AI agent that wasn't strict about link syntax.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;### [Sección 1] Title&lt;/code&gt; is literal text, not auto-numbered.&lt;/strong&gt; Two of my lessons had &lt;code&gt;### [Sección 1] The economy...&lt;/code&gt; and &lt;code&gt;### [Sección 2] When to use them...&lt;/code&gt; literally in the markdown. False alarm: I thought the converter was adding the "Sección 1" prefix. It wasn't — the source content had it. Skool renders it verbatim. Strip those patterns from your source before converting.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Headings inside blockquotes get flattened.&lt;/strong&gt; Skool only renders the blockquote's left border on &lt;code&gt;paragraph&lt;/code&gt; children. A real &lt;code&gt;bulletList&lt;/code&gt; inside a &lt;code&gt;blockquote&lt;/code&gt; visually escapes the callout. The converter handles this by flattening nested lists inside blockquotes to paragraphs with &lt;code&gt;•&lt;/code&gt; prefixes. Cosmetic, but a fact to know if your markdown style relies on nested structure inside callouts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tables with many columns degrade.&lt;/strong&gt; Tables that fit (≤5 cols × ≤10 rows × ≤30 chars/cell) render as monospace code blocks (preserves alignment). Larger tables degrade to bulleted lists with bold-key prefixes. Acceptable, but plan your tables accordingly.&lt;/p&gt;




&lt;h2&gt;
  
  
  Trap 4: Re-running creates a NEW course (course-create is not idempotent)
&lt;/h2&gt;

&lt;p&gt;The script that creates a course top-to-bottom is &lt;em&gt;not&lt;/em&gt; idempotent. Re-running it creates an entirely new course with the same name, not an update.&lt;/p&gt;

&lt;p&gt;Skool has no "upsert course by name." There's no unique constraint on course title within a community. If your script fails halfway and you re-run it, you now have two half-built courses with the same name.&lt;/p&gt;

&lt;p&gt;How I handle this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;For initial course creation:&lt;/strong&gt; dry-run against a test Skool community first. I use &lt;code&gt;nyx-trial-run-8420&lt;/code&gt; for this. Only push to production (CAR) once the test passes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;For incremental updates&lt;/strong&gt; (add a lesson, fix a typo): use a different code path that takes the existing &lt;code&gt;courseId&lt;/code&gt; and &lt;code&gt;pageId&lt;/code&gt; as inputs. No course creation involved. The IDs are checked into the script as constants — yes, hardcoded, on purpose.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;For full re-publishes&lt;/strong&gt; (rare): delete the old course manually in the UI first, then re-run the script.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The pattern I land on for any Skool automation now: the create-course path and the update-course path are different scripts, with different inputs, and only the create-course one ever runs against a test community first.&lt;/p&gt;




&lt;h2&gt;
  
  
  The actor calls (the actual flow)
&lt;/h2&gt;

&lt;p&gt;Skipping the markdown parsing, the cover image render, and the directory walk — the Skool side of the pipeline is four actor calls per course.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Upload the cover image
&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;"action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"files:uploadImage"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"groupSlug"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"cagala-aprende-repite"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"cookies"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;from auth:login&amp;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;"params"&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;"file"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;base64-encoded JPG of the cover&amp;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;p&gt;Returns &lt;code&gt;coverImage&lt;/code&gt; (the S3 reference) + &lt;code&gt;coverImageFile&lt;/code&gt; (a UUID Skool stores separately). You need both for the next call.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Create the course
&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;"action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"classroom:createCourse"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"groupSlug"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"cagala-aprende-repite"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"cookies"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;...&amp;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;"params"&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;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"🧠 Intro a LLMs · Decide cuál usar"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"desc"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Aprende a elegir el modelo correcto para cada caso de uso."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"coverImage"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;from step 1&amp;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;"coverImageFile"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;from step 1&amp;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;"privacy"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"minTier"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"state"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&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;p&gt;Returns &lt;code&gt;courseId&lt;/code&gt;. Course is now visible (but empty) in the classroom.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: For each module folder, create a section
&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;"action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"classroom:createFolder"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"groupSlug"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"cagala-aprende-repite"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"cookies"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;...&amp;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;"params"&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;"parentCourseId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;from step 2&amp;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;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"🧱 El LLM no es un Oráculo"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"state"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&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;p&gt;Returns the section's &lt;code&gt;folderId&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 4: For each lesson markdown, create the page + set the body
&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;"action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"classroom:createPage"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"groupSlug"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"cagala-aprende-repite"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"cookies"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;...&amp;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;"params"&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;"courseId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;from step 2&amp;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;"parentId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;folderId from step 3&amp;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;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1.1 El LLM no es un Oráculo ni un Google"&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;p&gt;Returns &lt;code&gt;pageId&lt;/code&gt;. Then:&lt;br&gt;
&lt;/p&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;"action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"classroom:setBody"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"groupSlug"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"cagala-aprende-repite"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"cookies"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;...&amp;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;"params"&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;"pageId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;from above&amp;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;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1.1 El LLM no es un Oráculo ni un Google"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"bodyMarkdown"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;the contents of L1.1-el-llm-no-es-oraculo-ni-google.md&amp;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;p&gt;Lesson is live in the classroom.&lt;/p&gt;

&lt;h3&gt;
  
  
  One detail: delete the placeholder page
&lt;/h3&gt;

&lt;p&gt;Skool auto-creates an empty &lt;em&gt;New page&lt;/em&gt; in every new course. The script deletes it after step 4 so the user doesn't see an empty placeholder. The actor exposes this via &lt;code&gt;classroom:deletePage&lt;/code&gt; if you need it.&lt;/p&gt;




&lt;h2&gt;
  
  
  What this saved me
&lt;/h2&gt;

&lt;p&gt;The math on a single course:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Step&lt;/th&gt;
&lt;th&gt;Manual (UI clicks)&lt;/th&gt;
&lt;th&gt;Automated (actor calls)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Create course + cover&lt;/td&gt;
&lt;td&gt;~3 minutes&lt;/td&gt;
&lt;td&gt;2 calls (~2s)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Create 5 folders&lt;/td&gt;
&lt;td&gt;~5 minutes (1/folder, modal friction)&lt;/td&gt;
&lt;td&gt;5 calls (~3s)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Create 15 lessons + bodies&lt;/td&gt;
&lt;td&gt;~30-45 minutes (1.5-3 min/lesson)&lt;/td&gt;
&lt;td&gt;30 calls (~30s)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Total per course&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;38-53 minutes&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~35 seconds&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Across 18 courses: roughly &lt;strong&gt;12 hours of clicking&lt;/strong&gt; vs &lt;strong&gt;~10 minutes of script execution&lt;/strong&gt; + the time it took to write the script (one afternoon, reusable across all courses).&lt;/p&gt;

&lt;p&gt;The first course paid back the entire build investment. The next 17 are pure margin.&lt;/p&gt;

&lt;p&gt;Costs on the actor side: ~$0.20 per course at current pricing ($0.005 per result for the 1 result returned by each call, $0.01 per write for ~35 writes per course). Eighteen courses cost less than $4 to publish. Less than the hourly value of fifteen minutes of clicking.&lt;/p&gt;




&lt;h2&gt;
  
  
  How to copy this for your community
&lt;/h2&gt;

&lt;p&gt;If you're sitting on a directory of course content (markdown, Google Docs, Notion exports) and looking at the manual upload path with dread, the pattern is:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Normalize your source content&lt;/strong&gt; to markdown files in a consistent directory structure. One &lt;code&gt;.md&lt;/code&gt; file per lesson, first line is the title, content is everything below.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Render or upload your course covers&lt;/strong&gt; once. Each course needs a cover; you can either prerender all of them or generate them from a template (I use a Tailwind HTML template + Playwright screenshot).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Authenticate once&lt;/strong&gt; with &lt;code&gt;auth:login&lt;/code&gt;. The actor returns cookies valid for ~3.5 days.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Walk your directory&lt;/strong&gt;, calling &lt;code&gt;classroom:createCourse&lt;/code&gt; → &lt;code&gt;classroom:createFolder&lt;/code&gt; per module → &lt;code&gt;classroom:createPage&lt;/code&gt; + &lt;code&gt;classroom:setBody&lt;/code&gt; per lesson.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dry-run against a test community first.&lt;/strong&gt; Spin up a free Skool community for testing if you don't have one. Skool's create-course is not idempotent — get a clean publish out of the test community before pointing the script at production.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Save the resulting course IDs and page IDs&lt;/strong&gt; if you'll ever need to update individual lessons. Hardcode them in your incremental-update script.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The whole thing is one Apify actor with one consistent input shape. In n8n / Make.com / Zapier, each call is a single node.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;👉 &lt;a href="https://apify.com/cristiantala/skool-all-in-one-api?fpr=cristian" rel="noopener noreferrer"&gt;Skool API — Posts, Members &amp;amp; Classroom on Apify&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  What this unlocks
&lt;/h2&gt;

&lt;p&gt;The directory-as-source-of-truth pattern is what makes the rest of my Skool operations sustainable. The curriculum lives in version-controlled markdown. Editing a lesson is a &lt;code&gt;git commit&lt;/code&gt; away from being live. New courses are a copy of an existing directory + &lt;code&gt;node scripts/build-course.mjs&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The Skool UI is now the &lt;em&gt;viewer&lt;/em&gt; for community members. The &lt;em&gt;editor&lt;/em&gt; is my laptop.&lt;/p&gt;

&lt;p&gt;If you want the broader picture of what the actor can do beyond classroom — posts, members, comments, files, events — I wrote the pillar guide here: &lt;em&gt;&lt;a href="https://dev.to/cristiantalasanchez/the-complete-skool-api-guide-2026-posts-members-classroom-and-100-automations-3a73"&gt;The Complete Skool API Guide (2026)&lt;/a&gt;&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;And if you want the other case study from this series — how I publish podcast episodes to the classroom 100% automatically with the same actor — that's here: &lt;em&gt;&lt;a href="https://dev.to/cristiantalasanchez/how-i-publish-podcast-episodes-to-a-skool-classroom-100-automatically-37a4"&gt;How I Publish Podcast Episodes to Skool 100% Automatically&lt;/a&gt;&lt;/em&gt;.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Currently testing a similar pipeline for the next 18 courses. If you've automated something on Skool that needs an endpoint not in the actor today, open an issue on the actor's Apify page. That's how the roadmap moves.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>skool</category>
      <category>automation</category>
      <category>classroom</category>
      <category>markdown</category>
    </item>
    <item>
      <title>How I Publish Podcast Episodes to a Skool Classroom 100% Automatically</title>
      <dc:creator>Cristian Tala</dc:creator>
      <pubDate>Sun, 17 May 2026 14:40:24 +0000</pubDate>
      <link>https://dev.to/cristiantalasanchez/how-i-publish-podcast-episodes-to-a-skool-classroom-100-automatically-37a4</link>
      <guid>https://dev.to/cristiantalasanchez/how-i-publish-podcast-episodes-to-a-skool-classroom-100-automatically-37a4</guid>
      <description>&lt;h1&gt;
  
  
  How I Publish Podcast Episodes to a Skool Classroom 100% Automatically
&lt;/h1&gt;

&lt;p&gt;We record an episode of &lt;em&gt;Es La Hora De Aprender&lt;/em&gt; every week. Three hosts, hour and change of conversation about AI, startups, and the LATAM ecosystem. By the time we finish recording, the next 60 minutes of work are mechanical:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Transcribe.&lt;/li&gt;
&lt;li&gt;Cut a thumbnail.&lt;/li&gt;
&lt;li&gt;Publish to the podcast website.&lt;/li&gt;
&lt;li&gt;Notify the email list.&lt;/li&gt;
&lt;li&gt;Cross-post to two WordPress sites for SEO.&lt;/li&gt;
&lt;li&gt;Add the episode as a lesson in the Skool community classroom.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I do exactly zero of those steps by hand. The whole chain runs from one shell command. The Skool step — adding the new episode as a lesson in the &lt;em&gt;Podcasts CAR&lt;/em&gt; course inside my community — is what I want to walk through here.&lt;/p&gt;

&lt;p&gt;This is one of the few automations that &lt;em&gt;requires&lt;/em&gt; the Skool API. Skool's UI doesn't expose any bulk-add for classroom lessons. If you want a new episode to appear in your classroom every week, you either click through eight modals manually, or you call the API.&lt;/p&gt;

&lt;p&gt;I run &lt;a href="https://apify.com/cristiantala/skool-all-in-one-api?fpr=cristian" rel="noopener noreferrer"&gt;the Skool API actor on Apify&lt;/a&gt; for this. The actor exposes the classroom endpoints I reverse-engineered. Here's what the pipeline does end-to-end, and the gotchas I hit building it.&lt;/p&gt;




&lt;h2&gt;
  
  
  What the automation produces
&lt;/h2&gt;

&lt;p&gt;The end state, for context: a course inside my community called &lt;em&gt;Podcasts CAR&lt;/em&gt;, free for all members, with one folder per show and one lesson per episode. Episodes are ordered newest-first.&lt;/p&gt;

&lt;p&gt;Each lesson is a single page with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A 1-2 line hook for the episode&lt;/li&gt;
&lt;li&gt;The YouTube thumbnail (full size, clickable to YouTube)&lt;/li&gt;
&lt;li&gt;Direct links to YouTube, Spotify, Apple Podcasts&lt;/li&gt;
&lt;li&gt;Two short paragraphs on what's covered&lt;/li&gt;
&lt;li&gt;Five concrete takeaways&lt;/li&gt;
&lt;li&gt;An open question for the community&lt;/li&gt;
&lt;li&gt;Footer with hosts + episode date&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The lesson is &lt;em&gt;not&lt;/em&gt; the transcript. The transcript lives on &lt;code&gt;eslahoradeaprender.com&lt;/code&gt; for SEO. The classroom lesson is a curated synthesis — the version a community member skims to decide whether the episode is worth their hour.&lt;/p&gt;

&lt;p&gt;That distinction matters. If you dump the transcript into the classroom, you cannibalize your own SEO and the lesson becomes too long to skim. Synthesis in the classroom, full transcript on the podcast site.&lt;/p&gt;

&lt;p&gt;12 episodes published this way so far. Zero manual clicks per episode.&lt;/p&gt;




&lt;h2&gt;
  
  
  The pipeline, end to end
&lt;/h2&gt;

&lt;p&gt;The chain is six steps. Skool is step 5.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Episode published&lt;/strong&gt; on the podcast website (Astro static site)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Build check&lt;/strong&gt; + git push + IndexNow notification to Bing/Yandex&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Syndicated&lt;/strong&gt; to &lt;code&gt;cristiantala.com&lt;/code&gt; (WordPress, as a &lt;code&gt;podcast_episodes&lt;/code&gt; custom post type) and &lt;code&gt;ecosistemastartup.com&lt;/code&gt; (WordPress, as a regular post)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Google Search Console&lt;/strong&gt; sitemap resubmit&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Skool lesson created&lt;/strong&gt; in the &lt;em&gt;Podcasts CAR&lt;/em&gt; course → this post is about this step&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Email notification&lt;/strong&gt; to the newsletter list&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Steps 1-4 and 6 are out of scope for this post. Step 5 is what the Skool API handles.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Skool needed the API
&lt;/h2&gt;

&lt;p&gt;When I designed the &lt;em&gt;Podcasts CAR&lt;/em&gt; course, I had two options:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Option A:&lt;/strong&gt; publish each episode as a separate Skool post in the community feed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Option B:&lt;/strong&gt; publish each episode as a lesson inside a course in the classroom.&lt;/p&gt;

&lt;p&gt;Option A is what most Skool community owners do. It's the path of least resistance because the UI makes it easy. It also means the episode scrolls out of the feed in two days and is never findable again.&lt;/p&gt;

&lt;p&gt;Option B (classroom) gives you a permanent, indexed, browsable archive. New members can binge old episodes the way they binge any other course. Episodes don't compete with daily feed activity. And the format scales: I added a second folder for the &lt;em&gt;Ecosistema Startup&lt;/em&gt; podcast without rebuilding anything.&lt;/p&gt;

&lt;p&gt;But Option B has zero UI affordance for "add a new lesson to an existing course from outside Skool." You have to log in, navigate to the course, click "Add lesson", fill in the modal, drag the lesson into the right position, click save, repeat for the body content, set the cover, save again. Every. Single. Week.&lt;/p&gt;

&lt;p&gt;The API lets me do it in two function calls.&lt;/p&gt;




&lt;h2&gt;
  
  
  The actor calls (the actual code)
&lt;/h2&gt;

&lt;p&gt;Here's the slimmed-down version of what the pipeline does after the episode is published on the podcast site. Skipping error handling and the YouTube ID extraction so the flow is clear.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Build the lesson body in markdown
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# EP12: Ley IA Chile · agentes autónomos · default a IA&lt;/span&gt;

Mediados de mayo. Cristian, Diego y Rodrigo discuten el borrador
de la ley IA chilena, qué significa "agente autónomo" en la
práctica, y por qué cada vez más gente vuelve al default de
preguntarle a la IA antes que a Google.

&lt;span class="gu"&gt;## Ver o escuchar el episodio&lt;/span&gt;

&lt;span class="p"&gt;![&lt;/span&gt;&lt;span class="nv"&gt;EP12 en YouTube&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;https://img.youtube.com/vi/VIDEO_ID/maxresdefault.jpg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

▶️ &lt;span class="gs"&gt;**YouTube**&lt;/span&gt; — &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;youtube.com/watch?v=VIDEO_ID&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;https://youtube.com/watch?v=VIDEO_ID&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
🎧 &lt;span class="gs"&gt;**Spotify**&lt;/span&gt; — &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;open.spotify.com/episode/...&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;https://open.spotify.com/episode/...&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
🍎 &lt;span class="gs"&gt;**Apple Podcasts**&lt;/span&gt; — &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;podcasts.apple.com/...&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;https://podcasts.apple.com/...&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="gu"&gt;## Lo que se cubre&lt;/span&gt;

[Two paragraphs of synthesis — what the episode is about, written
to be skimmable in 45 seconds]

&lt;span class="gu"&gt;## 5 takeaways concretos&lt;/span&gt;
&lt;span class="p"&gt;
1.&lt;/span&gt; ...
&lt;span class="p"&gt;2.&lt;/span&gt; ...
&lt;span class="p"&gt;3.&lt;/span&gt; ...
&lt;span class="p"&gt;4.&lt;/span&gt; ...
&lt;span class="p"&gt;5.&lt;/span&gt; ...

&lt;span class="gu"&gt;## Pregunta abierta para la comunidad&lt;/span&gt;

[A real open question that invites a comment in the community,
not a rhetorical one]
&lt;span class="p"&gt;
---&lt;/span&gt;
&lt;span class="ge"&gt;*Cristian Tala · Diego Arias · Rodrigo Rojo · 15-may-2026*&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is just a string in my pipeline. Skool eats markdown via the actor; I don't have to learn their internal TipTap JSON format.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Authenticate (once per 3.5 days)
&lt;/h3&gt;

&lt;p&gt;The actor's &lt;code&gt;auth:login&lt;/code&gt; action returns a cookie string that's valid for ~3.5 days. I cache it in my pipeline's KV store and only re-login when it expires.&lt;br&gt;
&lt;/p&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;"action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"auth:login"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"admin@cristiantala.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;"password"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&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;"groupSlug"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"cagala-aprende-repite"&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;p&gt;Returns:&lt;br&gt;
&lt;/p&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;"success"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"cookies"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"auth_token=...; client_id=...; aws-waf-token=..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"expiresAt"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-05-20T22:51:34.636Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"buildId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1778782667413"&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;
  
  
  Step 3: Create the lesson page
&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;"action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"classroom:createPage"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"groupSlug"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"cagala-aprende-repite"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"cookies"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;from auth:login&amp;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;"params"&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;"courseId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"76b80da4e0ef48cb9da7b7f23229f44a"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"parentId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;folder-id-for-ELHDA&amp;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;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"EP12: Ley IA Chile · agentes autónomos · default a IA"&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;p&gt;The response includes a &lt;code&gt;pageId&lt;/code&gt;. We use that next.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 4: Set the lesson body
&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;"action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"classroom:setBody"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"groupSlug"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"cagala-aprende-repite"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"cookies"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;from auth:login&amp;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;"params"&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;"pageId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;from step 3&amp;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;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"EP12: Ley IA Chile · agentes autónomos · default a IA"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"bodyMarkdown"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;the markdown from step 1&amp;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;p&gt;That's it. The episode is now a lesson in the classroom, ordered at the top of the &lt;em&gt;ELHDA&lt;/em&gt; folder.&lt;/p&gt;

&lt;p&gt;End-to-end from "episode published on podcast site" to "lesson live in Skool classroom" — about 30 seconds, mostly waiting on Skool's API.&lt;/p&gt;




&lt;h2&gt;
  
  
  Three gotchas that cost me time
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. YouTube embeds: thumbnail-only, no native player
&lt;/h3&gt;

&lt;p&gt;I wanted an embedded YouTube player in the lesson. Skool's REST API accepts a &lt;code&gt;videoId&lt;/code&gt; field in &lt;code&gt;setBody&lt;/code&gt; — but it requires Skool's &lt;em&gt;internal&lt;/em&gt; video ID, not the YouTube ID.&lt;/p&gt;

&lt;p&gt;When you paste a YouTube URL into Skool's UI editor, Skool's frontend hits some endpoint, resolves the YouTube URL into an internal video ID, and stores that. There's no documented REST endpoint to do this resolution programmatically.&lt;/p&gt;

&lt;p&gt;For now I render the YouTube thumbnail as a markdown image and put the YouTube link immediately below. Visually it looks like a clickable embed. Functionally, the click goes to YouTube instead of playing inline. Acceptable trade-off.&lt;/p&gt;

&lt;p&gt;Capturing the YouTube → Skool video ID endpoint with Playwright is on the roadmap. If you'd find it useful, open an issue on the actor — that's how I prioritize.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. YouTube ID regex: don't use &lt;code&gt;\w+&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;My first version of the pipeline extracted YouTube IDs from URLs with a regex that used &lt;code&gt;\w+&lt;/code&gt;. That matches letters, digits, and underscores — but not hyphens.&lt;/p&gt;

&lt;p&gt;YouTube IDs are exactly 11 characters from &lt;code&gt;[A-Za-z0-9_-]&lt;/code&gt;. Two of my episodes had IDs starting with or containing hyphens. The regex captured &lt;code&gt;43nvC&lt;/code&gt; instead of &lt;code&gt;43nvC-1fxKY&lt;/code&gt; and &lt;code&gt;Ph&lt;/code&gt; instead of &lt;code&gt;Ph-7H1atqoA&lt;/code&gt;. Episode 7's ID started with &lt;code&gt;-&lt;/code&gt; and the regex didn't match at all.&lt;/p&gt;

&lt;p&gt;Fix: use &lt;code&gt;[A-Za-z0-9_-]{11}&lt;/code&gt; for YouTube IDs. Always specify the character class and the fixed length.&lt;/p&gt;

&lt;p&gt;Generic-feeling gotcha, but it cost me an afternoon. Sharing in case it saves you one.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Re-running the pipeline creates a NEW course
&lt;/h3&gt;

&lt;p&gt;The script I use for one-shot course creation (initial publish of the &lt;em&gt;Podcasts CAR&lt;/em&gt; course, all 12 episodes at once) is &lt;em&gt;not&lt;/em&gt; idempotent. Re-running it creates an entirely new course, not an update. Skool has no "upsert course by name."&lt;/p&gt;

&lt;p&gt;For incremental episode additions, I use a different code path that:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Looks up the existing &lt;code&gt;courseId&lt;/code&gt; (hardcoded in my pipeline)&lt;/li&gt;
&lt;li&gt;Looks up the existing &lt;code&gt;folderId&lt;/code&gt; (also hardcoded)&lt;/li&gt;
&lt;li&gt;Creates just the new page (&lt;code&gt;createPage&lt;/code&gt;) and sets the body (&lt;code&gt;setBody&lt;/code&gt;)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you build this kind of automation: keep the course ID and folder IDs as constants in your pipeline. Don't recompute them by name lookup unless you want a course nuke on a typo.&lt;/p&gt;




&lt;h2&gt;
  
  
  What this saves me per week
&lt;/h2&gt;

&lt;p&gt;The manual version of this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Log in to Skool&lt;/li&gt;
&lt;li&gt;Navigate to &lt;em&gt;Podcasts CAR&lt;/em&gt; course&lt;/li&gt;
&lt;li&gt;Click &lt;em&gt;Add lesson&lt;/em&gt; on the ELHDA folder&lt;/li&gt;
&lt;li&gt;Type the title&lt;/li&gt;
&lt;li&gt;Drag the new lesson to position 1 (newest first)&lt;/li&gt;
&lt;li&gt;Click into the lesson&lt;/li&gt;
&lt;li&gt;Type or paste the body content&lt;/li&gt;
&lt;li&gt;Save&lt;/li&gt;
&lt;li&gt;Confirm cover renders, save again if it doesn't&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Realistic time: 8-12 minutes per episode if you're focused, more if you context-switch in the middle. Weekly podcast = 35-50 minutes/month, every month, forever.&lt;/p&gt;

&lt;p&gt;The automated version: zero seconds of human time. The shell command that publishes the episode to the website fires the whole chain.&lt;/p&gt;

&lt;p&gt;Multiply this across all the other things I automate against Skool (member approvals, daily engagement bot, course publishing) and the actor pays for itself the first week.&lt;/p&gt;




&lt;h2&gt;
  
  
  How to copy this
&lt;/h2&gt;

&lt;p&gt;If you have a Skool community and a podcast (or any recurring content), the pattern transfers directly:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Create one course&lt;/strong&gt; in your Skool classroom to hold the archive (do this manually, once)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Note down the &lt;code&gt;courseId&lt;/code&gt; and &lt;code&gt;folderId&lt;/code&gt;&lt;/strong&gt; — you'll hardcode these in your pipeline&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Authenticate once&lt;/strong&gt; with &lt;code&gt;auth:login&lt;/code&gt;, cache the cookies for 3.5 days&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;For each new content item&lt;/strong&gt;, call &lt;code&gt;classroom:createPage&lt;/code&gt; + &lt;code&gt;classroom:setBody&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The whole automation is two actor calls per episode (plus the auth refresh every few days). In n8n, that's two HTTP request nodes. In Make.com, two Apify modules. In Zapier, two steps.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;👉 &lt;a href="https://apify.com/cristiantala/skool-all-in-one-api?fpr=cristian" rel="noopener noreferrer"&gt;Skool API — Posts, Members &amp;amp; Classroom on Apify&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Pricing: pay-per-event. Two writes per episode + auth occasionally = a few cents per week per podcast.&lt;/p&gt;

&lt;p&gt;If you want the full pillar on what the actor can do beyond classroom (posts, members, comments, files): I wrote that here — &lt;em&gt;&lt;a href="https://dev.to/cristiantalasanchez/the-complete-skool-api-guide-2026-posts-members-classroom-and-100-automations-3a73"&gt;The Complete Skool API Guide (2026)&lt;/a&gt;&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;And if you want the next case study — uploading an 18-course classroom from markdown in a single script — that's here: &lt;em&gt;&lt;a href="https://dev.to/cristiantalasanchez/how-i-uploaded-an-18-course-classroom-to-skool-with-one-script-and-the-bug-that-almost-killed-my-2pi1"&gt;How I Uploaded an 18-Course Classroom to Skool With One Script&lt;/a&gt;&lt;/em&gt;.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Found a gotcha I didn't cover, or you've automated something on Skool that requires an endpoint the actor doesn't expose? Open an issue on the actor's Apify page. That's how the roadmap gets built.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>skool</category>
      <category>automation</category>
      <category>podcast</category>
      <category>apify</category>
    </item>
    <item>
      <title>The Complete Skool API Guide (2026): Posts, Members, Classroom, and 100% Automations</title>
      <dc:creator>Cristian Tala</dc:creator>
      <pubDate>Sun, 17 May 2026 14:40:21 +0000</pubDate>
      <link>https://dev.to/cristiantalasanchez/the-complete-skool-api-guide-2026-posts-members-classroom-and-100-automations-3a73</link>
      <guid>https://dev.to/cristiantalasanchez/the-complete-skool-api-guide-2026-posts-members-classroom-and-100-automations-3a73</guid>
      <description>&lt;h1&gt;
  
  
  The Complete Skool API Guide (2026): Posts, Members, Classroom, and 100% Automations
&lt;/h1&gt;

&lt;p&gt;Skool doesn't have a public API. They've said this publicly, repeatedly, for years.&lt;/p&gt;

&lt;p&gt;That's a problem if you run a community on Skool and want to do anything beyond clicking buttons in their UI: bulk-approve members, auto-reply to comments, publish a course from markdown, sync members to your CRM, post the latest podcast episode to your classroom without opening a browser.&lt;/p&gt;

&lt;p&gt;I run a Skool community called Cágala, Aprende, Repite (CAR). 484 members, paid tiers, daily activity. There's no way I'm clicking buttons for all of that. So I reverse-engineered the API. Then I built it into an Apify actor so you don't have to.&lt;/p&gt;

&lt;p&gt;This guide is everything I learned. Real endpoints, real auth flow, real gotchas — including the ones that cost me a week of debugging.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;One thing upfront:&lt;/strong&gt; every code snippet here shows you how to call the actor on Apify, not the actor's source code. The implementation lives in a private repo for reasons I'll explain at the end. You can run the actor today without touching the source.&lt;/p&gt;




&lt;h2&gt;
  
  
  How Skool actually works under the hood
&lt;/h2&gt;

&lt;p&gt;Skool runs on two backends, and most third-party tools get this wrong.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reads&lt;/strong&gt; go through Next.js SSR endpoints. When you load a community page in your browser, the data comes from &lt;code&gt;https://www.skool.com/_next/data/{buildId}/{slug}.json&lt;/code&gt;. Fast, no auth challenge, perfect for scraping.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Writes&lt;/strong&gt; go through a separate REST API at &lt;code&gt;https://api2.skool.com&lt;/code&gt;. Different auth surface, different headers, different error patterns.&lt;/p&gt;

&lt;p&gt;This split has two consequences you'll hit:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;The &lt;code&gt;buildId&lt;/code&gt; rotates roughly weekly&lt;/strong&gt; when Skool deploys a new version of their frontend. If your scraper caches a buildId and that build expires, every read returns 404 with no clear hint that you need to refresh.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Authentication tokens expire on different clocks.&lt;/strong&gt; The session JWT lasts months, but the Cloudflare WAF token (&lt;code&gt;aws-waf-token&lt;/code&gt;) expires after about 3.5 days. After that, all writes return 403 until you re-authenticate through a fresh browser session.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A naive scraper breaks every 3-7 days for one of these two reasons. The actor handles both automatically.&lt;/p&gt;




&lt;h2&gt;
  
  
  Authentication: cookies vs Playwright
&lt;/h2&gt;

&lt;p&gt;Skool's login flow is protected by Cloudflare WAF. You can't just &lt;code&gt;POST /login&lt;/code&gt; with email + password and get a token. You need a real browser to clear the challenge, which is why the actor uses Playwright for the initial login.&lt;/p&gt;

&lt;p&gt;The full cookie set Skool requires:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;auth_token&lt;/code&gt; — JWT, long-lived (months)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;client_id&lt;/code&gt; — 32-char hex, stable per session&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;aws-waf-token&lt;/code&gt; — Cloudflare WAF cookie, expires ~3.5 days&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All three are required. Drop any one and writes fail with 403.&lt;/p&gt;

&lt;p&gt;The actor exposes an &lt;code&gt;auth:login&lt;/code&gt; action that runs the Playwright flow once and returns a cookie string you can reuse:&lt;br&gt;
&lt;/p&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;"action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"auth:login"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"you@example.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;"password"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&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;"groupSlug"&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-skool-group"&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;p&gt;Response:&lt;br&gt;
&lt;/p&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;"success"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"cookies"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"auth_token=...; client_id=...; aws-waf-token=..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"expiresAt"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-05-20T22:51:34.636Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"expiresInDays"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;3.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"buildId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1778782667413"&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;p&gt;Subsequent calls pass the &lt;code&gt;cookies&lt;/code&gt; string and skip the Playwright bootstrap. A login takes about 10 seconds. A cookie-authenticated call takes about 2. If you're running a workflow that does many operations, this matters.&lt;/p&gt;

&lt;p&gt;When the WAF cookie expires (every 3.5 days), the actor returns a structured error with &lt;code&gt;errorCode: AUTH_REQUIRED&lt;/code&gt; and you re-run &lt;code&gt;auth:login&lt;/code&gt;. Schedule this in your automation and you never think about auth again.&lt;/p&gt;




&lt;h2&gt;
  
  
  The endpoint catalog (what you can actually do)
&lt;/h2&gt;

&lt;p&gt;The actor covers every Skool resource I've reverse-engineered. Each one is a separate &lt;code&gt;action&lt;/code&gt; in the actor input.&lt;/p&gt;

&lt;h3&gt;
  
  
  Posts
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Action&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;posts:list&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;List posts in a community (with pagination, sort, category filter)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;posts:get&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Fetch a single post by ID, with author, likes, label&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;posts:create&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Create a top-level post. &lt;strong&gt;Requires &lt;code&gt;labelId&lt;/code&gt;&lt;/strong&gt; if the community has categories (it does)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;posts:update&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Edit title/content/label of an existing post&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;posts:delete&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Delete a post (admin only)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;posts:createComment&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Reply to a post or to another comment&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;posts:getComments&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Up to ~30 top-level comments per call&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;posts:getCommentsFull&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Playwright-based scrape that returns ALL comments in a thread (slower, charged at scrape rate)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Posts and comments are the same object in Skool's data model. A comment is just a post with &lt;code&gt;rootId&lt;/code&gt; (the original post) and &lt;code&gt;parentId&lt;/code&gt; (its direct parent). This matters for one specific case I'll get to in a minute.&lt;/p&gt;

&lt;h3&gt;
  
  
  Members
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Action&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;members:list&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;List members of a group&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;members:pending&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;List waitlist (people who applied but not yet approved)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;members:approve&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Approve a pending member&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;members:reject&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Reject a pending member&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;members:ban&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Ban an existing member&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;members:batchApprove&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Approve multiple at once&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Classroom (courses, folders, lessons)
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Action&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;classroom:createCourse&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Create a top-level course with cover image, privacy, tier gate, drip schedule&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;classroom:createFolder&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Add a section (folder) inside a course&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;classroom:createPage&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Add a lesson page inside a folder&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;classroom:setBody&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Set the lesson body. Accepts markdown and converts to Skool's TipTap JSON format internally&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;classroom:updateCourse&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Update course metadata. &lt;strong&gt;Read-then-write internally&lt;/strong&gt; because of a subtle Skool quirk (see "Gotchas" below)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;classroom:updateResources&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Attach uploaded files to a lesson's Resources section&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Files
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Action&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;files:uploadImage&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Upload a cover image. Returns the S3 reference Skool expects&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;files:uploadFile&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Upload any file (PDF, ZIP, etc.) for use as a lesson resource. Sets &lt;code&gt;privacy:1&lt;/code&gt; automatically — Skool silently rejects files without it&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Groups
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Action&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;groups:get&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Fetch a group's full metadata: members count, categories (&lt;code&gt;labels&lt;/code&gt;), tiers, settings&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Events
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Action&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;events:list&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;List events with real next-occurrence times + timezone + occurrenceId for RSVP&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  System
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Action&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;system:health&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Cheap, no-auth health check&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;system:debug&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Returns Apify egress IP, raw Skool homepage status, extracted buildId, and a full &lt;code&gt;posts:list&lt;/code&gt; replication — invaluable when something breaks intermittently&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Common gotchas (the stuff that bit me, so it doesn't bite you)
&lt;/h2&gt;

&lt;p&gt;These aren't theoretical. Each one cost me hours.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. &lt;code&gt;posts:create&lt;/code&gt; requires &lt;code&gt;labelId&lt;/code&gt; if your community has categories
&lt;/h3&gt;

&lt;p&gt;If your Skool community has post categories (almost all do), &lt;code&gt;posts:create&lt;/code&gt; without &lt;code&gt;labelId&lt;/code&gt; returns:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;HTTP&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;422&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"object_type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"post"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"fields"&lt;/span&gt;&lt;span class="p"&gt;:[{&lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"metadata.labels"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"error"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"You must select a category"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"user"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kc"&gt;true&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;p&gt;The actor surfaces this as &lt;code&gt;errorCode: MISSING_CATEGORY&lt;/code&gt; with a hint. Fetch the available labels with &lt;code&gt;groups:get&lt;/code&gt;, then pass the labelId.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Top-level comments need &lt;code&gt;parentId = rootId&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;This is the most unintuitive piece of Skool's data model. To create a top-level comment on a post, you set BOTH &lt;code&gt;parentId&lt;/code&gt; AND &lt;code&gt;rootId&lt;/code&gt; to the post's ID. To reply to an existing comment, you set &lt;code&gt;rootId&lt;/code&gt; to the original post and &lt;code&gt;parentId&lt;/code&gt; to the comment you're replying to.&lt;br&gt;
&lt;/p&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;"action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"posts:createComment"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"params"&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;"rootId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"post-id"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"parentId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"post-id"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;same&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;rootId&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;top-level&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"content"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&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;p&gt;Skip this and you get a 404 that says nothing useful.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. &lt;code&gt;posts:update&lt;/code&gt; body shape is flat, not wrapped
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;posts:create&lt;/code&gt; wraps its data in a &lt;code&gt;metadata&lt;/code&gt; object. &lt;code&gt;posts:update&lt;/code&gt; does NOT — it expects flat fields. Sending the wrapper returns 200 OK and silently ignores your update.&lt;/p&gt;

&lt;p&gt;The actor handles the shape difference for you. If you're talking to the Skool API directly, this will burn you for a day. (It burned me for a day.)&lt;/p&gt;

&lt;h3&gt;
  
  
  4. &lt;code&gt;classroom:updateCourse&lt;/code&gt; silently resets &lt;code&gt;privacy&lt;/code&gt; to 0
&lt;/h3&gt;

&lt;p&gt;If you PUT a course with a partial body, Skool quietly resets &lt;code&gt;privacy&lt;/code&gt; (your paywall) to &lt;code&gt;0&lt;/code&gt; (Open) and &lt;code&gt;amount&lt;/code&gt; (price) to &lt;code&gt;0&lt;/code&gt;. Tier gating is preserved. Privacy and amount are not.&lt;/p&gt;

&lt;p&gt;I caught this against twelve production courses. The actor's &lt;code&gt;updateCourse&lt;/code&gt; does a read-then-write internally: fetches the current state, merges your input on top, writes the full body. Slower by ~200ms, but your paywall doesn't disappear.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. &lt;code&gt;BUILDID_STALE&lt;/code&gt; 404s are usually transient
&lt;/h3&gt;

&lt;p&gt;Skool deploys a new build of their frontend, your cached buildId goes stale, you get 404s on reads. The actor's retry handler refreshes the buildId from the homepage and retries automatically.&lt;/p&gt;

&lt;p&gt;If you see this in your error logs and it self-resolves 30 minutes later, that was a Skool deploy mid-flight (or a Cloudflare blip on Apify's egress IP). The actor logs &lt;code&gt;system:debug&lt;/code&gt; snapshots so you can diagnose without redeploying.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. &lt;code&gt;x402-payment-required&lt;/code&gt; ≠ payment problem
&lt;/h3&gt;

&lt;p&gt;If the actor returns &lt;code&gt;x402-payment-required&lt;/code&gt; on every action including reads, this is &lt;strong&gt;not&lt;/strong&gt; a billing issue. It's Apify's &lt;code&gt;notice: UNDER_MAINTENANCE&lt;/code&gt; flag, triggered automatically when a published actor fails its daily quality check.&lt;/p&gt;

&lt;p&gt;The actor's default action is &lt;code&gt;system:health&lt;/code&gt;, which never throws — so the quality check stays green. If you ever see this flag, clear it with one PUT to the Apify API. (Documentation in the actor README.)&lt;/p&gt;

&lt;h3&gt;
  
  
  7. &lt;code&gt;members:approve&lt;/code&gt; and &lt;code&gt;members:reject&lt;/code&gt; need &lt;code&gt;memberId&lt;/code&gt;, not &lt;code&gt;id&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Skool returns two IDs per member: &lt;code&gt;id&lt;/code&gt; is the global user ID (stable across Skool), &lt;code&gt;memberId&lt;/code&gt; is the group-specific membership ID. Approve/reject/ban operations need &lt;code&gt;memberId&lt;/code&gt;. Using &lt;code&gt;id&lt;/code&gt; returns HTTP 404 with no useful message.&lt;/p&gt;

&lt;p&gt;The actor surfaces both fields and uses the correct one. If you're talking to Skool directly, this single mismatch will silently kill a batch of 50 approvals.&lt;/p&gt;




&lt;h2&gt;
  
  
  How I use this in production
&lt;/h2&gt;

&lt;p&gt;I'm not building this as a toy. CAR has 484 members, 19 courses in the classroom, daily posts, daily approvals, a podcast that syndicates new episodes to the community. None of that is manual.&lt;/p&gt;

&lt;p&gt;A few examples (each one is its own deep-dive post — links below):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Publishing podcast episodes to the classroom 100% automatically.&lt;/strong&gt; New episode lands on &lt;code&gt;eslahoradeaprender.com&lt;/code&gt; → my pipeline syndicates the show notes to the community classroom as a new lesson with the YouTube thumbnail, all in under 30 seconds. Twelve episodes published this way so far, zero manual clicks.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Uploading an 18-course classroom from markdown.&lt;/strong&gt; When I shipped the curriculum, every course (folders, lessons, covers, tier gates) came from &lt;code&gt;.md&lt;/code&gt; files in a local directory. One script, ~3 hours of total runtime to push 18 courses. The R-PUT-COURSE gotcha above came from this exact project.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Daily engagement bot for the community feed.&lt;/strong&gt; Detects unanswered posts in the community feed, drafts a reply using the community's content (podcast back-catalog, blog, course corpus), sends to Telegram for approval, publishes on click.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you want the deep-dives:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;em&gt;&lt;a href="https://dev.to/cristiantalasanchez/how-i-publish-podcast-episodes-to-a-skool-classroom-100-automatically-37a4"&gt;How I Publish Podcast Episodes to Skool 100% Automatically&lt;/a&gt;&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;a href="https://dev.to/cristiantalasanchez/how-i-uploaded-an-18-course-classroom-to-skool-with-one-script-and-the-bug-that-almost-killed-my-2pi1"&gt;How I Uploaded an 18-Course Classroom With One Script&lt;/a&gt;&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Get started
&lt;/h2&gt;

&lt;p&gt;The actor is on Apify, ready to use:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;👉 &lt;a href="https://apify.com/cristiantala/skool-all-in-one-api?fpr=cristian" rel="noopener noreferrer"&gt;Skool API — Posts, Members &amp;amp; Classroom&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Pricing is pay-per-event: $0.005 per result returned, $0.01 per write operation, $0.05 for Playwright-based deep scrapes. No subscription. If you're testing it, you'll spend cents.&lt;/p&gt;

&lt;p&gt;A complete 10-line example to create a post in your community:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="s2"&gt;"https://api.apify.com/v2/acts/cristiantala~skool-all-in-one-api/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s1"&gt;'Content-Type: application/json'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
    "action": "posts:create",
    "groupSlug": "your-skool-slug",
    "cookies": "auth_token=...; client_id=...; aws-waf-token=...",
    "params": {
      "title": "Hello from the API",
      "content": "First post via Apify.",
      "labelId": "your-category-id"
    }
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For workflow tools, it's a single Apify node in n8n, Make.com, or Zapier. Pass &lt;code&gt;action&lt;/code&gt;, &lt;code&gt;groupSlug&lt;/code&gt;, &lt;code&gt;cookies&lt;/code&gt;, and the action-specific &lt;code&gt;params&lt;/code&gt;. Same shape everywhere.&lt;/p&gt;

&lt;p&gt;If you're building AI agents (Claude, ChatGPT function calling, LangChain, OpenClaw) that need to interact with a Skool community: same actor, called as a tool. The action names map cleanly to capabilities.&lt;/p&gt;




&lt;h2&gt;
  
  
  What's next
&lt;/h2&gt;

&lt;p&gt;The actor covers most of Skool's surface area, but not all. On the wishlist (open as GitHub issues on the actor's Apify page):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Pin to Course Page&lt;/strong&gt; — pin a post to a specific course view rather than the global feed. Endpoint exists in Skool's UI; needs capture.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;About Page API&lt;/strong&gt; — programmatically read/write a group's About page.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Per-page drip schedules&lt;/strong&gt; — investigating whether Skool supports drip at the lesson level (not just course level).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;YouTube video embed in lessons&lt;/strong&gt; — Skool generates an internal video ID when you paste a YouTube URL in the editor. We can render thumbnails today, but native embeds need that endpoint captured.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you have a Skool automation that's currently impossible because the endpoint isn't covered, open an issue. Most of them are an afternoon of Playwright capture away.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why the source is private
&lt;/h2&gt;

&lt;p&gt;A common question: "Is this open source?"&lt;/p&gt;

&lt;p&gt;It's not. The TypeScript SDK behind the actor (&lt;code&gt;skool-js&lt;/code&gt;) and the actor wrapper itself live in a private GitHub repo. There are three reasons:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The actor IS the product.&lt;/strong&gt; If the SDK were public on npm, the conversion path to actual revenue collapses. The actor pays for itself plus my time maintaining the reverse-engineering against Skool's deploys.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Skool deploys frequently.&lt;/strong&gt; When the WAF flow changes, the buildId path changes, or a new captcha is added, the actor needs a patch within hours. A private repo with paid distribution gives me a sustainable maintenance loop. An open repo with infinite forks does not.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The reverse-engineering itself has cost.&lt;/strong&gt; Each endpoint captured took 30 minutes to several hours of UI interception. That work compounds in the actor — not in a free clone.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you need self-hosted SDK access for a specific use case, that's a different conversation; reach out. For everything else, the actor is the fastest path from "I have a Skool community" to "my Skool community runs itself."&lt;/p&gt;




&lt;p&gt;If this guide was useful, the best way to help me keep improving the actor is to use it. Every run validates a real use case and tells me what to capture next. Find a gap or hit a gotcha I haven't documented? Open an issue on the actor page — they get answered.&lt;/p&gt;

</description>
      <category>skool</category>
      <category>api</category>
      <category>automation</category>
      <category>n8n</category>
    </item>
    <item>
      <title>Cambié el Cerebro de Mi Coding Agent: De Opus a Modelos Open-Source por $30/mes</title>
      <dc:creator>Cristian Tala</dc:creator>
      <pubDate>Tue, 12 May 2026 19:00:04 +0000</pubDate>
      <link>https://dev.to/cristiantalasanchez/cambie-el-cerebro-de-mi-coding-agent-de-opus-a-modelos-open-source-por-30mes-3d2e</link>
      <guid>https://dev.to/cristiantalasanchez/cambie-el-cerebro-de-mi-coding-agent-de-opus-a-modelos-open-source-por-30mes-3d2e</guid>
      <description>&lt;h2&gt;
  
  
  Cómo Reemplazar Claude Pro ($20/mes) y Ahorrar un 96% en Producción
&lt;/h2&gt;

&lt;p&gt;Hace dos años, si me hubieran dicho que iba a reemplazar Claude Pro por algo open-source, me hubiera muerto de risa. «Seguí soñando», te habría dicho. «Los modelos de arriba son mejores porque sí.»&lt;/p&gt;

&lt;p&gt;Abril 2026. Anthropic removió silenciosamente a Claude Code del plan Pro de $20/mes. La página de precios quedó con una X donde antes había un check. No hubo comunicado. No hubo email. Un developer lo tweeteó y generó 900K views en Twitter y 400+ comentarios furiosos en Hacker News.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿Qué pasó realmente?&lt;/strong&gt; Que el plan «Pro» nunca fue para uso real de un coding agent. Si estás corriendo un agente 3-4 horas por día, el costo real de Opus no es $20/mes — es &lt;strong&gt;$11,250/mes por desarrollador&lt;/strong&gt;. Esto no es un bug. Es una feature del modelo de suscripción: te hace pensar que pagás $20 cuando en realidad consumís $11,250.&lt;/p&gt;

&lt;h3&gt;
  
  
  El costo real de Opus en producción: hasta $11,250/mes por desarrollador
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Mi benchmark corrió 8,000+ tests en 70 modelos para responder exactamente esta pregunta. Los números duelen:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;El escenario coding agent es el más revelador. Un agente que lee ~50K tokens de contexto por archivo y genera ~5K tokens de output por archivo. Si haces 1,000 archivos por día, Claude Opus te sale $11,250/mes. La alternativa open-source más capaz para ese caso de uso sale $484/mes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Calidad no es el problema.&lt;/strong&gt; Opus 4.7 tiene quality score de 8.08 — top 5 entre todos los modelos medidos. El problema es que estás pagando por una capability que no necesitas en la forma en que la estás usando.&lt;/p&gt;

&lt;h3&gt;
  
  
  Thinking forzado empeora tus agentes: 8 de 9 modelos rinden peor
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Acá viene el hallazgo más contraintuitivo del benchmark.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;De los 9 modelos hybrid medidos con &lt;code&gt;force_reasoning=high&lt;/code&gt; en la suite de tests agénticos multi-turno:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;8 de 9 empeoran&lt;/strong&gt; su score vs sin thinking forzado&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Opus 4.7: &lt;strong&gt;-0.67 puntos&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Sonnet 4.6: &lt;strong&gt;-0.50 puntos&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Hermes 4 70B: &lt;strong&gt;-0.54 puntos&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Solo &lt;strong&gt;Kimi K2.5 sube&lt;/strong&gt; (+0.73 puntos) — la excepción&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Un sistema que es 95% correcto en cada paso es solo &lt;strong&gt;36% correcto en 20 pasos&lt;/strong&gt;. No es un failure de prompting. Es un &lt;strong&gt;architecture failure&lt;/strong&gt;. La forma en que orchestration, persistence, tool driving y verification composition determinan el resultado tanto como el modelo mismo.&lt;/p&gt;

&lt;p&gt;La implicación para founders que arman agentes en n8n o OpenClaw: &lt;strong&gt;no pagues premium por modelos con thinking forzado&lt;/strong&gt;. Estás pagando más por un resultado peor en multi-turno real.&lt;/p&gt;

&lt;h4&gt;
  
  
  ¿Por qué 8 de 9 modelos rinden peor con reasoning forzado?
&lt;/h4&gt;

&lt;p&gt;El reasoning extendido extiende la cadena de pensamiento del modelo antes de emitir una respuesta. En benchmarks estáticos (HumanEval, MATH), esto ayuda. En agentes multi-turno que interactúan con herramientas, archivos y APIs en tiempo real, cada segundo adicional de «pensar» es un segundo en que el estado del sistema puede cambiar.&lt;/p&gt;

&lt;p&gt;El modelo piensa más, pero el mundo también cambió mientras pensaba. La respuesta correcta cuando empezó a procesar ya no es correcta cuando termina. Esto lo confirma también el postmortem de Anthropic del 23 de abril de 2026: &lt;em&gt;«On March 4, we changed Claude Code’s default reasoning effort from high to medium to reduce very long latency.»&lt;/em&gt; — el mismo Anthropic encontró que menos thinking era mejor para la experiencia de usuario. Y cuando revirtieron a high effort después de las quejas, descubrieron que venía con sus propios problemas de calidad.&lt;/p&gt;

&lt;h3&gt;
  
  
  Provider matters: Groq direct supera a OpenRouter por +0.16 a +0.25 puntos
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Otro hallazgo del benchmark que no es obvio a menos que midas.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;El mismo modelo rinde mejor cuando el provider es directo (Groq, NIM, Xiaomi) que cuando pasa por un agregador como OpenRouter. Patrón consistente verificado en 4 proveedores con el mismo modelo.&lt;/p&gt;

&lt;p&gt;Groq usa hardware dedicado (LPU — Language Processing Unit) en lugar de GPUs tradicionales. El resultado: hasta 10x más velocidad de inferencia. Los números reales de &lt;a href="https://www.morphllm.com/llm-api" rel="noopener noreferrer"&gt;MorphLLM&lt;/a&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Llama 3.1 8B @ Groq: &lt;strong&gt;840 tok/s&lt;/strong&gt; (el más rápido del mercado)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Llama 4 Scout @ Groq: &lt;strong&gt;594 tok/s&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Competencia GPU-based: típicamente 80-150 tok/s&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Groq no solo es más rápido — el mismo Llama 3.3 70B rinde mejor ahí que en OpenRouter porque el routing overhead del agregador introduce latencia y variabilidad. La recomendación entonces no es solo «elegí el modelo correcto». Es &lt;strong&gt;«elegí el modelo correcto EN el provider correcto»&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  El costo de la dependencia: por qué un founder no debería depender de un solo proveedor a $100/mes
&lt;/h3&gt;

&lt;p&gt;Les cuento algo que me costó dos exits aprender.&lt;/p&gt;

&lt;p&gt;En Pago Fácil, en 2018, dependíamos de un solo proveedor de pagos para el core del negocio. Cuando el proveedor decidió cambiar sus condiciones a mitad de año, nos dejó 60 días para renegociar o migrar. 60 días con un negocio que procesaba $2M/mes en transacciones. Yo estaba solo — sin cofundadores, sin equipo de legal sofisticado, sin leverage. Tuve que aceptar las condiciones porque no había alternativa real en ese momento.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;La dependencia tiene un costo que no aparece en el sticker price. Lo escribí en detalle en «&lt;a href="https://dev.to/la-dependencia-perfecta-cuando-tu-proveedor-de-ia-se-cae-y-tu-te-quedas-mirando/"&gt;La dependencia perfecta&lt;/a&gt;«.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Con los modelos de IA pasa lo mismo. Si tu flujo de automatización completo depende de Opus a $25/MTok y Anthropic decide subir precios (como ya hizo removiendo Claude Code de Pro), no tienes opción real. O aceptás las nuevas condiciones o reconstruís todo desde cero.&lt;/p&gt;

&lt;p&gt;La estrategia correcta no es «encuentra el modelo más barato». Es &lt;strong&gt;«arquitecta para tener siempre un plan B que no te destruya»&lt;/strong&gt;. Esto significa:&lt;/p&gt;

&lt;p&gt;-模型的que usas en producción tener al menos un backup en otro provider que renda comparable&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;NUNCA architecturalizar con la assumption de que un solo provider va a estar disponible o accesible en 12 meses&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Preferir modelos con licencias open-source (Apache 2.0, MIT) sobre modelos proprietary cuando el delta de calidad lo permita&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;8 de los 10 primeros del benchmark usan licencia Apache 2.0 o MIT. No es casualidad.&lt;/p&gt;

&lt;h3&gt;
  
  
  Top 10 del benchmark: 8 de 10 son open-source
&lt;/h3&gt;

&lt;p&gt;El open-source no es «la opción del pobre». Es la opción que maximiza valor real por dólar invertido — especialmente cuando la métrica es «qué tan bien funciona en MI agente de producción», no «qué tan bien sale en HumanEval».&lt;/p&gt;

&lt;h3&gt;
  
  
  Paso a paso: cómo migré mi stack de $200/mes a $30/mes
&lt;/h3&gt;

&lt;p&gt;Esto es lo que hice en la práctica, no la teoría.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Semana 1: Evaluar&lt;/strong&gt; Corrí el benchmark completo en mis casos de uso reales — no en los benchmarks sintéticos. Los que importaban: automation scripts de n8n, parsing de emails, generación de reportes, code review de PRs en GitHub. Identifiqué qué modelos rendían &amp;gt;=90% de la calidad de Opus en CADA caso de uso específico.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Semana 2-3: Dual run&lt;/strong&gt; Corriste ambos sistemas en paralelo durante 2 semanas. OpenCode con &lt;strong&gt;&lt;a href="https://dev.to/minimax-m27-modelo-ia-gratuito-open-source-produccion-2026/"&gt;MiniMax M2.7-highspeed&lt;/a&gt;&lt;/strong&gt; para desarrollo day-to-day. Claude Pro seguía disponible para arquitectura y decisiones complejas donde Opus genuinamente aporta. Medí output quality con revisiones manuales.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Semana 4: Cortar&lt;/strong&gt; Apagué la suscripción a Claude Pro cuando el dual run showed &amp;lt;5% de tareas donde Opus había sido significativamente mejor. Exploré esta dinámica a fondo en &lt;a href="https://dev.to/claude-code-sin-pagar-200-dolares-al-mes/"&gt;Claude Code sin pagar $200 al mes&lt;/a&gt;. El corte fue en marzo 2026 — antes del movimiento de Anthropic, pero la decisión ya estaba tomada con datos propios.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Resultado:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Antes: $200/mes en Claude Pro (usaba API directa + Pro seat)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Después: $30/mes aproximadamente ($20 MiniMax subscription + $10 Ollama Cloud + electricidad)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Productividad en tareas de coding: no medí baja objetiva&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Tasks donde todavía uso Opus (API directa, pay-per-use): ~2-3 por semana, &amp;lt;$20/mes adicional&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Stack recomendado por presupuesto
&lt;/h3&gt;

&lt;h4&gt;
  
  
  $0/mes: 100% local con Ollama
&lt;/h4&gt;

&lt;p&gt;Si tienes hardware decente (32GB+ RAM), puedes correr modelos open-source directamente en tu máquina. DeepSeek-Coder V3, Qwen 2.5 Coder 32B, Mistral 7B — todos disponibles en Ollama con install one-liner. Tengo una &lt;a href="https://dev.to/herramientas-de-ia-self-hosted-la-guia-completa-para-2026/"&gt;guía completa de herramientas self-hosted&lt;/a&gt; donde reviso las opciones en detalle.&lt;/p&gt;

&lt;p&gt;Costo real: $0/mes en subscriptions. Solo electricidad (~2-3/kWh dependiendo de dónde estés).&lt;/p&gt;

&lt;p&gt;Limitación: latencia más alta que cloud, sin internet no funciona. Para tareas batch o que no son tiempo-real, perfectamente viable.&lt;/p&gt;

&lt;h4&gt;
  
  
  $20-50/mes: Groq + Ollama Cloud
&lt;/h4&gt;

&lt;p&gt;Groq tier gratuito tiene 40 RPM con modelos como Llama 3.1 8B y 70B. Para automatización con volumen bajo-medio, esto alcanza. Si necesitas más volumen, el tier pago de Groq corre ~$15/mes por 500K tokens/mes en los modelos más rápidos.&lt;/p&gt;

&lt;p&gt;Complementás con Ollama Cloud para modelos que Groq no tiene.&lt;/p&gt;

&lt;h4&gt;
  
  
  $100+/mes: API directa + Cursor Pro
&lt;/h4&gt;

&lt;p&gt;Si todavía necesitas Opus para tareas complejas con volumen alto, la API directa de Anthropic (pay-per-use) es más flexible que el plan Max $100/mes. Pagas por lo que usás realmente.&lt;/p&gt;

&lt;p&gt;A este nivel de gasto, Cursor Pro ($20/mes) como IDE con Claude Code integration puede reemplazar el workflow completo de desarrollo. No es lo mismo que Claude Code standalone, pero para un developer individual es suficiente.&lt;/p&gt;

&lt;h3&gt;
  
  
  El cierre que Anthropic no te dice
&lt;/h3&gt;

&lt;p&gt;Cuando Anthropic removió Claude Code de Pro, no fue un accidente. Les estaban diciendo algo en código: &lt;strong&gt;«el modelo de suscripción $20 no cierra con el uso real de un coding agent.»&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Y tenían razón.&lt;/p&gt;

&lt;p&gt;Para founders que construyen agentes en producción, la alternativa no es «buscar el mejor descuento en Anthropic». Es arquitecturar para producción con modelos que maximized value per dollar en el caso de uso real — y con la resiliencia de no depender de un solo proveedor.&lt;/p&gt;

&lt;p&gt;Todo esto está medido. Los datos del benchmark — 8,000+ runs, 70 modelos — están públicos en GitHub. Publiqué el &lt;a href="https://dev.to/benchmark-de-modelos-ai-para-agentes-openclaw-n8n-abril-2026/"&gt;benchmark completo de abril 2026&lt;/a&gt; con metodología. La calculadora interactiva te deja filtrar por presupuesto, calls/mes y caso de uso.&lt;/p&gt;

&lt;p&gt;No me creas a mí. Corré los números vos mismo.&lt;/p&gt;

&lt;h3&gt;
  
  
  FAQ
&lt;/h3&gt;

&lt;h4&gt;
  
  
  ¿Realmente puedo reemplazar Claude Code con un modelo open-source?
&lt;/h4&gt;

&lt;p&gt;Para la mayoría de casos de uso, sí. Para coding asistido (autocomplete, refactors simples, code review), modelos como Llama 3.3 70B o Devstral rinden al nivel de Sonnet 4.6. Para tareas de código complejo o architecture decisions de alto nivel, Opus sigue siendo top. El punto es que no necesitas Opus para todo — solo para lo que realmente lo requiere.&lt;/p&gt;

&lt;h4&gt;
  
  
  ¿Qué pasa si ya pago Claude Pro?
&lt;/h4&gt;

&lt;p&gt;Si usas Claude Code 3+ horas por día, el plan Pro se te queda corto igual. Los límites de uso de Pro son agresivos para uso agéntico real. La alternativa más económica es API directa de Anthropic + un wrapper como Aider o Cline, que te sale $15-40/mes según uso real.&lt;/p&gt;

&lt;h4&gt;
  
  
  ¿Groq es confiable para producción?
&lt;/h4&gt;

&lt;p&gt;Groq tiene rate limits más bajos que OpenRouter en el tier gratuito (40 RPM). Para automatización de producción con volumen alto, la recomendación es combinar Groq (para modelos que ya conoces y rinden bien) + un provider de backup para cuando Groq tiene degraded performance. Mi stack usa ambos.&lt;/p&gt;

&lt;h4&gt;
  
  
  ¿El costo es realmente tan diferente o es clickbait?
&lt;/h4&gt;

&lt;p&gt;Los $11,250/mes son para un escenario específico: 1,000 archivos de código procesados por día con Opus 4.7. Si tu volumen es menor, el costo baja proporcionalmente. Un developer que usa Claude Code 1 hora por día puede estar en $30-50/mes con API directa. El punto no es que todos van a pagar $11,250/mes — es que el modelo de suscripción &lt;strong&gt;oculta&lt;/strong&gt; el costo real cuando tu uso escala.&lt;/p&gt;

&lt;h4&gt;
  
  
  ¿Dónde están los datos del benchmark?
&lt;/h4&gt;

&lt;p&gt;Todo el dataset, metodología y código fuente están públicos en &lt;a href="https://github.com/ctala/ai-benchmarks-alternativos" rel="noopener noreferrer"&gt;github.com/ctala/ai-benchmarks-alternativos&lt;/a&gt; bajo licencia MIT. 8,000+ runs, 70 modelos, scoring ponderado por costo real para founders LATAM. La calculadora interactiva está en &lt;a href="https://benchmarks.cristiantala.com" rel="noopener noreferrer"&gt;benchmarks.cristiantala.com&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The post &lt;a href="https://cristiantala.com/cambie-el-cerebro-de-mi-coding-agent-de-opus-a-modelos-open-source-por-30-mes/" rel="noopener noreferrer"&gt;Cambié el Cerebro de Mi Coding Agent: De Opus a Modelos Open-Source por $30/mes&lt;/a&gt; appeared first on &lt;a href="https://cristiantala.com" rel="noopener noreferrer"&gt;Cristian Tala Sánchez&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Este articulo fue publicado originalmente en &lt;a href="https://cristiantala.com/cambie-el-cerebro-de-mi-coding-agent-de-opus-a-modelos-open-source-por-30-mes/?utm_source=devto&amp;amp;utm_medium=syndication" rel="noopener noreferrer"&gt;cristiantala.com&lt;/a&gt;. Si te interesa emprendimiento, IA y automatizacion, unite gratis a la comunidad &lt;a href="https://www.skool.com/cagala-aprende-repite?utm_source=devto&amp;amp;utm_medium=syndication" rel="noopener noreferrer"&gt;Cagala, Aprende, Repite&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ia</category>
    </item>
    <item>
      <title>The Complete Skool API: 9 Months of Reverse-Engineering 33 Actions (n8n + TypeScript + AI Agents)</title>
      <dc:creator>Cristian Tala</dc:creator>
      <pubDate>Tue, 12 May 2026 18:16:50 +0000</pubDate>
      <link>https://dev.to/cristiantalasanchez/the-complete-skool-api-9-months-of-reverse-engineering-33-actions-n8n-typescript-ai-agents-254e</link>
      <guid>https://dev.to/cristiantalasanchez/the-complete-skool-api-9-months-of-reverse-engineering-33-actions-n8n-typescript-ai-agents-254e</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;: I spent 9 months reverse-engineering Skool.com — the community platform with millions of paying members but no public API. The result is a production &lt;a href="https://apify.com/cristiantala/skool-all-in-one-api" rel="noopener noreferrer"&gt;Apify actor&lt;/a&gt; that handles posts, comments, members, classroom courses, file uploads, Auto DM, and group settings — usable from n8n, Make.com, Zapier, or LLM agents (Claude, ChatGPT, LangChain) with pay-per-event pricing. Documentation, recipes, and the full API reference are at &lt;a href="https://github.com/ctala/skool-api-docs" rel="noopener noreferrer"&gt;github.com/ctala/skool-api-docs&lt;/a&gt;. This post is the technical story: what I learned, where Skool's architecture surprised me, and how this is being used in production today.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  The problem: Skool has no public API
&lt;/h2&gt;

&lt;p&gt;Skool is one of the fastest-growing community platforms — used by creators, course sellers, agencies, and SaaS founders to host paying communities ($30K+ MRR cases are common). It has tens of thousands of paying communities, millions of members.&lt;/p&gt;

&lt;p&gt;It has zero public API.&lt;/p&gt;

&lt;p&gt;If you're an admin running a community at scale, this means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Manually approving every new member application&lt;/li&gt;
&lt;li&gt;Manually replying to welcome threads&lt;/li&gt;
&lt;li&gt;Manually uploading course content one page at a time&lt;/li&gt;
&lt;li&gt;Manually copying content from other platforms into Skool&lt;/li&gt;
&lt;li&gt;No way to integrate Skool with n8n, Make.com, or your CRM&lt;/li&gt;
&lt;li&gt;No way to build AI agents that operate inside your community&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For a $30K MRR community, "manual" stops scaling fast. The official recommendation is "hire a community manager." That's a $3-5K/month line item to do data entry. For a single founder with AI agents available, it's absurd.&lt;/p&gt;

&lt;p&gt;So I started reverse-engineering.&lt;/p&gt;

&lt;h2&gt;
  
  
  Skool API architecture: SSR for reads, REST for writes
&lt;/h2&gt;

&lt;p&gt;When you look at Skool with browser DevTools, you don't see clean REST endpoints. You see two patterns intermixed:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Reads&lt;/strong&gt; go through Next.js SSR data endpoints: &lt;code&gt;/_next/data/{buildId}/{slug}.json&lt;/code&gt;. These return the same data the page would render server-side, in JSON. Fast, public-ish (still requires auth cookies), and oddly stable. The &lt;code&gt;buildId&lt;/code&gt; changes on every Skool deploy (~weekly), so you need to refresh it dynamically.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Writes&lt;/strong&gt; go through a separate REST API at &lt;code&gt;api2.skool.com&lt;/code&gt;. Create post, update comment, approve member, ban — all POST/DELETE to &lt;code&gt;api2.skool.com/...&lt;/code&gt;. Uses &lt;code&gt;Authorization: Bearer ...&lt;/code&gt; with JWT tokens.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This split is unusual. Most platforms either: (a) have a uniform REST/GraphQL API, or (b) hide reads behind an internal &lt;code&gt;/api/...&lt;/code&gt; route on the same domain. Skool does neither.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters for an API consumer&lt;/strong&gt;: you can't just hit one base URL. Your library needs two clients — one for SSR reads (with &lt;code&gt;buildId&lt;/code&gt; rotation logic), one for REST writes (with bearer token rotation logic).&lt;/p&gt;

&lt;h3&gt;
  
  
  The buildId rotation gotcha
&lt;/h3&gt;

&lt;p&gt;Every Skool deploy invalidates the cached &lt;code&gt;buildId&lt;/code&gt;. If your library hardcodes one, all reads stop working until you refresh.&lt;/p&gt;

&lt;p&gt;The fix: extract the current &lt;code&gt;buildId&lt;/code&gt; from the homepage HTML (&lt;code&gt;/&lt;/code&gt;) before reading. Skool exposes it in a &lt;code&gt;&amp;lt;script id="__NEXT_DATA__"&amp;gt;&lt;/code&gt; tag that contains &lt;code&gt;{"buildId":"..."}&lt;/code&gt;. Parse it, cache it, retry your read.&lt;/p&gt;

&lt;p&gt;Initially I extracted from &lt;code&gt;/dashboard&lt;/code&gt;, but Skool quietly removed that route in March 2026. Switched to &lt;code&gt;/&lt;/code&gt; with &lt;code&gt;/about&lt;/code&gt; fallback. Lesson: &lt;code&gt;buildId&lt;/code&gt; extraction needs to live in your library as a refreshable concern, not a constant.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Skool data model: posts and comments are the same object
&lt;/h2&gt;

&lt;p&gt;This is the elegant part of Skool's data model and the part most reverse engineers miss.&lt;/p&gt;

&lt;p&gt;In Skool, &lt;strong&gt;a post and a comment are the same database entity&lt;/strong&gt;. The difference is just two fields:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;rootId&lt;/code&gt;: the original post ID. For a top-level post, &lt;code&gt;rootId == id&lt;/code&gt;. For a comment, &lt;code&gt;rootId&lt;/code&gt; points to the post it's commenting on.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;parentId&lt;/code&gt;: the immediate parent. For a top-level post, &lt;code&gt;parentId == id&lt;/code&gt;. For a comment on a post, &lt;code&gt;parentId == postId&lt;/code&gt;. For a nested reply, &lt;code&gt;parentId == commentId&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Reply to a post&lt;/strong&gt;: create with &lt;code&gt;rootId = postId, parentId = postId&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reply to a comment (nested)&lt;/strong&gt;: create with &lt;code&gt;rootId = postId, parentId = commentId&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Edit a comment&lt;/strong&gt;: use the post-update endpoint with the comment's ID&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Delete a comment&lt;/strong&gt;: use the post-delete endpoint with the comment's ID&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There is no &lt;code&gt;/comments&lt;/code&gt; endpoint. There is no &lt;code&gt;comments:&lt;/code&gt; namespace. Everything is &lt;code&gt;posts:&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Once you see this, the whole API gets simpler. I exposed it as the same &lt;code&gt;Posts&lt;/code&gt; module in my library, with &lt;code&gt;createComment()&lt;/code&gt; just being a thin wrapper around &lt;code&gt;createPost()&lt;/code&gt; that sets &lt;code&gt;rootId&lt;/code&gt; and &lt;code&gt;parentId&lt;/code&gt; correctly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Skool content format: plain text for posts, TipTap JSON for classroom
&lt;/h2&gt;

&lt;p&gt;For posts and comments: &lt;strong&gt;plain text&lt;/strong&gt;. No HTML, no markdown rendering server-side. The Skool editor handles formatting client-side via simple character codes (&lt;code&gt;**bold**&lt;/code&gt; becomes bold in the UI, but the stored content is literal characters).&lt;/p&gt;

&lt;p&gt;For &lt;strong&gt;classroom course bodies&lt;/strong&gt;: TipTap JSON. Skool's classroom uses &lt;a href="https://tiptap.dev" rel="noopener noreferrer"&gt;TipTap&lt;/a&gt; (the rich text editor library built on ProseMirror) and stores course/lesson bodies as TipTap JSON documents.&lt;/p&gt;

&lt;p&gt;This split made &lt;code&gt;classroom:setBody&lt;/code&gt; the most complex action in my library. To make it usable by non-developers, I wrote a markdown → TipTap converter from scratch (zero dependencies, ~500 LOC) that handles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Headings (h1-h6)&lt;/li&gt;
&lt;li&gt;Bold, italic, code, links&lt;/li&gt;
&lt;li&gt;Bullet and ordered lists&lt;/li&gt;
&lt;li&gt;Code blocks&lt;/li&gt;
&lt;li&gt;Blockquote callouts (Skool renders these as colored boxes)&lt;/li&gt;
&lt;li&gt;Tables (simple)&lt;/li&gt;
&lt;li&gt;Images and embeds&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This means you can write your course content in &lt;code&gt;.md&lt;/code&gt; files in Git, push to your repo, and have a CI job publish updates to Skool. Course-as-code.&lt;/p&gt;

&lt;h2&gt;
  
  
  Skool API authentication: cookies, JWT, and AWS WAF tokens
&lt;/h2&gt;

&lt;p&gt;Skool sits behind AWS WAF (Web Application Firewall) Captcha. Your authenticated session has three cookies that matter:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;auth_token&lt;/code&gt;: JWT, ~30 day expiry&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;client_id&lt;/code&gt;: device fingerprint, ~1 year&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;aws-waf-token&lt;/code&gt;: rotating, &lt;strong&gt;~3.5 day expiry&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If &lt;code&gt;aws-waf-token&lt;/code&gt; expires and you keep using the cached cookies, you get 403 errors that look like auth failures. The fix isn't to refresh &lt;code&gt;auth_token&lt;/code&gt; — it's to do a full Playwright login (which solves the WAF challenge and gets a fresh &lt;code&gt;aws-waf-token&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;My actor exposes this as &lt;code&gt;auth:login&lt;/code&gt; — runs Playwright once, returns a &lt;code&gt;cookies&lt;/code&gt; string with all three tokens, and your subsequent calls can reuse those cookies for ~3.5 days at ~2s per call (no browser needed for reads/writes once you have valid cookies).&lt;/p&gt;

&lt;h3&gt;
  
  
  Why this matters for scheduled jobs
&lt;/h3&gt;

&lt;p&gt;If you run a cron that hits Skool daily, you need to re-authenticate every 3-3.5 days. Either schedule it explicitly or build a retry-on-403 pattern that triggers re-auth. The actor returns structured &lt;code&gt;errorCategory: "auth_error"&lt;/code&gt; with &lt;code&gt;errorCode: "WAF_EXPIRED"&lt;/code&gt; so n8n / Make.com workflows can branch on it.&lt;/p&gt;

&lt;h2&gt;
  
  
  From skool-js TypeScript library to a production Skool API actor on Apify
&lt;/h2&gt;

&lt;p&gt;After 6 months of building &lt;code&gt;skool-js&lt;/code&gt; internally for my own use (operating &lt;a href="https://www.skool.com/cagala-aprende-repite/about" rel="noopener noreferrer"&gt;Cágala, Aprende, Repite&lt;/a&gt;, a 500+ member community), I realized other community operators had the same problem. The internal library was solid, the test suite covered ~85% of real-world use cases, but distributing a TypeScript library as the consumption layer was wrong: most community operators aren't developers, and shipping it as open source meant abandoning maintenance the moment my own community didn't need an update.&lt;/p&gt;

&lt;p&gt;The fix: wrap it in an &lt;a href="https://apify.com/cristiantala/skool-all-in-one-api" rel="noopener noreferrer"&gt;Apify actor&lt;/a&gt; with three properties:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Single HTTP endpoint&lt;/strong&gt; — any HTTP client (curl, Postman, n8n's HTTP node, Make.com's HTTP module) can call it&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pay-per-event pricing&lt;/strong&gt; — $0.005 per dataset result, $0.01 per write operation, $0.05 per scrape operation. No subscription, no minimums. You pay for what you use.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Action-based API&lt;/strong&gt; — single input with &lt;code&gt;action: "posts:create"&lt;/code&gt; (or 33 other actions), &lt;code&gt;groupSlug&lt;/code&gt;, &lt;code&gt;cookies&lt;/code&gt;, and &lt;code&gt;params&lt;/code&gt;. Consistent shape across the entire surface.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Single consumption layer: the &lt;a href="https://apify.com/cristiantala/skool-all-in-one-api" rel="noopener noreferrer"&gt;Apify actor&lt;/a&gt;, HTTP-callable from anything (n8n, Make.com, Zapier, Pipedream, custom backends, LLM tool-use), pay-per-event pricing, no infra to maintain on your side. The internal &lt;code&gt;skool-js&lt;/code&gt; library powers it but stays private — that's what keeps the actor sustainably maintained instead of becoming another abandoned reverse-engineering project on GitHub.&lt;/p&gt;

&lt;h2&gt;
  
  
  33 Skool API actions: posts, comments, members, classroom, files, groups
&lt;/h2&gt;

&lt;p&gt;The actor exposes these namespaces:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Posts&lt;/strong&gt; — list, filter (by date, by unanswered, combine criteria), get, create, update, delete, pin/unpin, vote (like/unlike), createComment, getComments (REST, fast, max ~35), &lt;code&gt;getCommentsFull&lt;/code&gt; (Playwright scroll, returns ALL comments in a thread bypassing Skool's REST cap)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Members&lt;/strong&gt; — list active, list pending applications, approve, reject, ban, batch approve&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Events&lt;/strong&gt; — list all calendar events, list upcoming&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Classroom (courses)&lt;/strong&gt; — create course, create folder, create page (lesson), set body from markdown, update course/page (preserves privacy/min_tier/amount), delete unit (cascades), get full tree, list courses, update resources (downloadable files)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Files&lt;/strong&gt; — upload cover image, upload private file (PDF/JSON/ZIP for classroom Resources with &lt;code&gt;privacy:1&lt;/code&gt;)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Groups&lt;/strong&gt; — get group info, set Auto DM message (with &lt;code&gt;#NAME#&lt;/code&gt; and &lt;code&gt;#GROUPNAME#&lt;/code&gt; tokens)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;System&lt;/strong&gt; — health check (no auth, no Skool calls — deterministic 2s response for monitoring)&lt;/p&gt;

&lt;p&gt;Every action returns either the requested data or a structured error payload (&lt;code&gt;success: false&lt;/code&gt;, &lt;code&gt;errorCode&lt;/code&gt;, &lt;code&gt;errorCategory&lt;/code&gt;, &lt;code&gt;retryable&lt;/code&gt;, &lt;code&gt;hint&lt;/code&gt;). The &lt;code&gt;hint&lt;/code&gt; field is designed for LLM tool-use: an agent can read it and self-correct on errors like missing categories or expired auth.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to integrate Skool with n8n, Make.com, and Zapier
&lt;/h2&gt;

&lt;p&gt;The Skool API actor is designed as a single HTTP endpoint, which makes it drop-in compatible with every workflow automation platform:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;n8n&lt;/strong&gt;: use the HTTP Request node. One node per Skool action. Pattern: &lt;code&gt;auth:login&lt;/code&gt; once → save cookies to workflow variable → reuse cookies across subsequent calls. &lt;a href="https://n8n.io/workflows/14392-auto-approve-skool-community-members-with-gpt-4o-ai-screening/" rel="noopener noreferrer"&gt;Free n8n template here&lt;/a&gt; shows the exact wiring for auto-approving members with GPT-4o screening.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Make.com&lt;/strong&gt;: use the HTTP module. Same pattern — login once, reuse cookies. The structured &lt;code&gt;errorCategory&lt;/code&gt; field in actor responses lets you build Router branches without try/catch logic.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Zapier&lt;/strong&gt;: works via webhook-trigger + HTTP action. Zapier's free tier supports this but you'll hit the task limit fast on busy communities. n8n self-hosted is the cost-efficient option once you have &amp;gt;10 daily workflow runs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pipedream&lt;/strong&gt;: native HTTP support. Drop the actor URL into any Pipedream step, pass &lt;code&gt;cookies&lt;/code&gt; from a stored secret.&lt;/p&gt;

&lt;p&gt;Why a single-endpoint, action-based API beats traditional REST for these platforms: every workflow node maps to one HTTP request with a different &lt;code&gt;action&lt;/code&gt; value. No URL templating, no header juggling per endpoint, no documentation hunt for "is it POST or PUT for editing?". Just &lt;code&gt;action: "posts:update"&lt;/code&gt; and you're done.&lt;/p&gt;

&lt;h2&gt;
  
  
  Using the Skool API with AI agents (Claude, ChatGPT, MCP, LangChain)
&lt;/h2&gt;

&lt;p&gt;Because every action has a consistent shape and structured error responses with recovery &lt;code&gt;hint&lt;/code&gt; fields, the Skool API actor is unusually well-suited as a &lt;strong&gt;tool&lt;/strong&gt; in LLM tool-calling stacks:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Anthropic Claude (tool use)&lt;/strong&gt;: define a single tool &lt;code&gt;skool_api&lt;/code&gt; with parameters &lt;code&gt;action&lt;/code&gt; (enum of 33 values), &lt;code&gt;groupSlug&lt;/code&gt;, &lt;code&gt;cookies&lt;/code&gt;, and &lt;code&gt;params&lt;/code&gt;. The model picks the right action per user request. Error hints feed back into the conversation for self-correction.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;OpenAI function calling&lt;/strong&gt;: same pattern, define one function. Function calling format is compatible.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;LangChain Tool&lt;/strong&gt;: wrap in a &lt;code&gt;Tool&lt;/code&gt; class. The actor returns dataset arrays which LangChain agents handle natively.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Model Context Protocol (MCP)&lt;/strong&gt;: Apify exposes any public actor via &lt;code&gt;https://mcp.apify.com?tools=cristiantala/skool-all-in-one-api&lt;/code&gt;. Configure once in Claude Desktop / Cursor / any MCP client, and the model sees all 33 actions as discoverable tools. No separate server to host — Apify handles the MCP layer for you, and the same pay-per-event billing applies (publishers earn from MCP invocations the same as regular runs).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Custom AI agents (OpenClaw, Cline, Aider, etc.)&lt;/strong&gt;: any agent that supports HTTP tool calls works. The actor docs include schemas in JSON Schema format for autogenerated tool definitions.&lt;/p&gt;

&lt;p&gt;This is where the "structured error payload with &lt;code&gt;hint&lt;/code&gt; field" design pays off. A naive HTTP wrapper around Skool's REST endpoints would return raw 422 errors. The actor returns:&lt;br&gt;
&lt;/p&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;"success"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"errorCode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"MISSING_CATEGORY"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"errorCategory"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"skool_api_error"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"hint"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"This Skool group requires posts to have a category. Pass `params.labelId` in posts:create. Get available labels with groups:get."&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;p&gt;An AI agent reads that &lt;code&gt;hint&lt;/code&gt; and self-corrects without human intervention. That's the difference between a wrapped REST API and an API designed for agents.&lt;/p&gt;

&lt;h2&gt;
  
  
  Production use cases (real examples)
&lt;/h2&gt;

&lt;p&gt;These are workflows running in production today:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Auto-approve members with AI screening
&lt;/h3&gt;

&lt;p&gt;n8n workflow:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Cron every 6h → &lt;code&gt;auth:login&lt;/code&gt; (if cookies expired)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;members:pending&lt;/code&gt; → returns list of pending applications with &lt;code&gt;whyJoin&lt;/code&gt; text&lt;/li&gt;
&lt;li&gt;For each: pass &lt;code&gt;whyJoin&lt;/code&gt; + LinkedIn URL to GPT-4o with a screening prompt ("does this person fit the community? rate 1-10")&lt;/li&gt;
&lt;li&gt;If rating ≥ 7 → &lt;code&gt;members:approve&lt;/code&gt;. If &amp;lt; 4 → &lt;code&gt;members:reject&lt;/code&gt; with message. Else → manual review in Telegram.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Result: hours per week saved. Spam applications filtered in seconds. &lt;a href="https://n8n.io/workflows/14392-auto-approve-skool-community-members-with-gpt-4o-ai-screening/" rel="noopener noreferrer"&gt;Published as a free n8n template here&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Auto-DM new members with personalized welcome
&lt;/h3&gt;

&lt;p&gt;One-time setup with &lt;code&gt;groups:setAutoDM&lt;/code&gt;, then runs forever inside Skool's own infra (Skool sends the DM, the actor just sets the template). Use &lt;code&gt;#NAME#&lt;/code&gt; and &lt;code&gt;#GROUPNAME#&lt;/code&gt; tokens for personalization. Skool's UI limits this to 300 chars, but you can fit a meaningful welcome + first action.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Publish a complete course from markdown files
&lt;/h3&gt;

&lt;p&gt;I write course content in &lt;code&gt;.md&lt;/code&gt; files in a private GitHub repo. CI job:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Detects changes to a course directory&lt;/li&gt;
&lt;li&gt;For each new lesson: &lt;code&gt;classroom:createPage&lt;/code&gt; + &lt;code&gt;classroom:setBody&lt;/code&gt; (markdown → TipTap conversion)&lt;/li&gt;
&lt;li&gt;For each updated lesson: &lt;code&gt;posts:update&lt;/code&gt; with new content&lt;/li&gt;
&lt;li&gt;For attached resources (PDFs): &lt;code&gt;files:uploadFile&lt;/code&gt; (with &lt;code&gt;privacy:1&lt;/code&gt;) + &lt;code&gt;classroom:updateResources&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Course-as-code. Lessons get reviewed via PR. Skool stays in sync with the repo.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Scrape ALL comments in a thread (bypass Skool's ~35 REST cap)
&lt;/h3&gt;

&lt;p&gt;Skool's REST endpoint for comments returns a maximum of ~35 per thread. For threads with hundreds (welcome threads, AMA posts, popular discussions), &lt;code&gt;posts:getCommentsFull&lt;/code&gt; uses Playwright to scroll the post page and extract every comment from the DOM. Slower (~30-60s) and costs $0.05 per invocation, but returns everything.&lt;/p&gt;

&lt;p&gt;I use this to audit my welcome thread: 229 introductions, find anyone I haven't replied to yet, generate personalized welcome messages, batch reply.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Auto-reply to unanswered posts
&lt;/h3&gt;

&lt;p&gt;Filter posts by &lt;code&gt;commentCount === 0&lt;/code&gt; after 24h, run them through an LLM with the community's context, generate a thoughtful first reply, post via &lt;code&gt;posts:createComment&lt;/code&gt; with manual approval before send. Stops valuable questions from sitting in the void.&lt;/p&gt;

&lt;h2&gt;
  
  
  Skool API alternatives: choosing the right tool for your use case
&lt;/h2&gt;

&lt;p&gt;There are roughly three approaches today to programmatic access to Skool:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Subscription-based API services&lt;/strong&gt; — third-party developers who built their own reverse-engineered API and resell access via API keys. These typically focus on read operations (list posts, list members) and have limited write coverage. Pricing is monthly subscription, regardless of usage. Good fit if you have predictable monthly volume and only need read access.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Generic scrapers on Apify Store&lt;/strong&gt; — single-purpose actors that extract one type of data (member emails, course videos, post lists). No write operations. Useful for one-off data extraction, not for ongoing automation.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Full read+write Skool API actor&lt;/strong&gt; — pay-per-event, complete CRUD across all surface area (posts, comments, members, classroom, files, groups, Auto DM). The Apify actor I built falls in this category. Best fit if you need ongoing writes (auto-approve, auto-comment, course publishing, Auto DM updates).&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Subscription API services&lt;/th&gt;
&lt;th&gt;Generic Apify scrapers&lt;/th&gt;
&lt;th&gt;This Skool API actor&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Read access&lt;/td&gt;
&lt;td&gt;Limited endpoints&lt;/td&gt;
&lt;td&gt;Single purpose&lt;/td&gt;
&lt;td&gt;All 33 actions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Write access&lt;/td&gt;
&lt;td&gt;Very limited&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;Full CRUD&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Classroom support&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Some scrapers only&lt;/td&gt;
&lt;td&gt;Full (create, update, delete, body, resources)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Auto DM&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes (&lt;code&gt;groups:setAutoDM&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pricing model&lt;/td&gt;
&lt;td&gt;Monthly subscription&lt;/td&gt;
&lt;td&gt;Pay-per-event&lt;/td&gt;
&lt;td&gt;Pay-per-event&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Best for&lt;/td&gt;
&lt;td&gt;Predictable read volume&lt;/td&gt;
&lt;td&gt;One-off extraction&lt;/td&gt;
&lt;td&gt;Ongoing community automation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI agent ready&lt;/td&gt;
&lt;td&gt;Manual schema&lt;/td&gt;
&lt;td&gt;Manual schema&lt;/td&gt;
&lt;td&gt;Action-based + hint field&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The "best" tool depends on your use case. If you only need to read data once, a generic scraper is fine. If you need ongoing writes (auto-approve members, auto-comment, course publishing, Auto DM updates), the full read+write actor is the only option that won't hit limits.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;Try the Skool API actor&lt;/strong&gt;: &lt;a href="https://apify.com/cristiantala/skool-all-in-one-api" rel="noopener noreferrer"&gt;apify.com/cristiantala/skool-all-in-one-api&lt;/a&gt;. First call gets you a &lt;code&gt;cookies&lt;/code&gt; string you can reuse for 3.5 days. Pay-per-event means typical "auto-approve 10 members" run costs $0.10. No subscription, no minimums. Used in production at CAR (500+ members) — before: 4h/week of manual approvals; after: 10 min/week of review.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Why I'm not building Skool's "official" API
&lt;/h2&gt;

&lt;p&gt;Skool will likely build a public API eventually. When they do, mine becomes redundant. That's fine.&lt;/p&gt;

&lt;p&gt;In the meantime: every community operator running at scale today either has this problem solved (using a tool like mine, or a custom in-house scraper) or doesn't scale. The market for community operations automation is real — Discord has Apps, Slack has Bots, Circle has Workflows, every modern platform has SOME automation surface. Skool's absence here is the gap, and someone has to fill it until they do.&lt;/p&gt;

&lt;p&gt;The actor itself is the product, but everything around it is in the open: &lt;a href="https://github.com/ctala/skool-api-docs" rel="noopener noreferrer"&gt;github.com/ctala/skool-api-docs&lt;/a&gt; has the full API reference, recipes, and a CHANGELOG that tracks every Skool-side change I detect. If you're a Skool community operator and you want to automate, the actor is one HTTP call away. If you're someone at Skool reading this — please ship a public API. I'll happily deprecate the actor when you do.&lt;/p&gt;

&lt;h2&gt;
  
  
  Architecture decisions I'd make again
&lt;/h2&gt;

&lt;p&gt;If I had to rebuild from scratch tomorrow:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Cookie reuse with explicit refresh action&lt;/strong&gt; — better than transparent re-auth. Users want to control when Playwright runs (it's the expensive call).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Action-based API instead of REST-style endpoints&lt;/strong&gt; — &lt;code&gt;posts:create&lt;/code&gt; reads better than &lt;code&gt;POST /posts&lt;/code&gt; when you're building tool-use schemas for LLMs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Structured error payloads with &lt;code&gt;hint&lt;/code&gt; field&lt;/strong&gt; — saved me from writing exhaustive error docs. The hint tells the user (or LLM agent) exactly what to do next.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Markdown → TipTap converter as a separate exported function&lt;/strong&gt; — testable, reusable, and the most common request from users.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Never throw, always push&lt;/strong&gt; — every error becomes a &lt;code&gt;success: false&lt;/code&gt; dataset item. Apify runs never &lt;code&gt;exit_fail&lt;/code&gt;. Workflows can branch on errorCategory without try/catch.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The one I'd change: I'd start with TypeScript strict mode from day 1. I retrofitted it after the library was already large and that was painful.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's next
&lt;/h2&gt;

&lt;p&gt;On the roadmap:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Events&lt;/strong&gt; (list/create/RSVP) — endpoints discovered but not yet stable&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Analytics&lt;/strong&gt; (engagement, revenue, member growth) — currently returns empty &lt;code&gt;pageProps&lt;/code&gt;, likely needs paid Skool plans&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Chat / DMs&lt;/strong&gt; — would require a different auth flow&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Search&lt;/strong&gt; — likely Elasticsearch-backed, endpoint TBD&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;"Send email to all members" toggle on posts:create&lt;/strong&gt; — discovered the field, needs validation in test community&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Webhooks&lt;/strong&gt; — Skool doesn't expose them yet, would need polling fallback&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If any of these are blocking you, open an issue at &lt;a href="https://github.com/ctala/skool-api-docs" rel="noopener noreferrer"&gt;github.com/ctala/skool-api-docs&lt;/a&gt; — prioritized by demand.&lt;/p&gt;

&lt;h2&gt;
  
  
  Skool API FAQ — common questions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Does Skool have a public API?
&lt;/h3&gt;

&lt;p&gt;No. Skool does not provide a public API. The endpoints used by the Skool web app are not documented or supported for external use. This actor and library reverse-engineer those endpoints and expose them as a clean, AI-friendly Skool API.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is reverse engineering the Skool API legal?
&lt;/h3&gt;

&lt;p&gt;Reverse engineering for interoperability with software you legitimately use is broadly accepted in most jurisdictions (US DMCA section 1201(f), EU Software Directive 2009/24/EC). I only use it against communities where I am an admin or have explicit permission. This is the same legal framing under which thousands of third-party Twitter/X clients, scraping libraries, and platform automation tools operate.&lt;/p&gt;

&lt;h3&gt;
  
  
  How do I authenticate with the Skool API?
&lt;/h3&gt;

&lt;p&gt;Two options: (1) &lt;strong&gt;Email + password&lt;/strong&gt; every call (uses Playwright, slower at ~10s, simpler), or (2) &lt;strong&gt;Cookie reuse&lt;/strong&gt; — run &lt;code&gt;auth:login&lt;/code&gt; once, save the returned cookies string, pass in subsequent calls for ~2s response time. Cookies last ~3.5 days before the AWS WAF token rotates. See the authentication section above.&lt;/p&gt;

&lt;h3&gt;
  
  
  What's the rate limit of the Skool API?
&lt;/h3&gt;

&lt;p&gt;Skool doesn't publish official rate limits. Empirically: ~60 reads/minute and ~20-30 writes/minute work without 429 errors. The library handles automatic retry on transient 429s with exponential backoff. For batch operations (e.g. approving 100 pending members), the actor paces requests automatically.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I use the Skool API with n8n?
&lt;/h3&gt;

&lt;p&gt;Yes. The actor is HTTP-callable from any platform with HTTP nodes — n8n, Make.com, Zapier, Pipedream, custom backends. There's a &lt;a href="https://n8n.io/workflows/14392-auto-approve-skool-community-members-with-gpt-4o-ai-screening/" rel="noopener noreferrer"&gt;free n8n template&lt;/a&gt; showing the full auto-approve workflow.&lt;/p&gt;

&lt;h3&gt;
  
  
  How is this different from third-party Skool API services?
&lt;/h3&gt;

&lt;p&gt;Three differences. &lt;strong&gt;Coverage&lt;/strong&gt;: 33 actions including full classroom, file uploads, and Auto DM — most third-party services are read-only. &lt;strong&gt;Pricing&lt;/strong&gt;: pay-per-event ($0.005-$0.05 per call) instead of fixed monthly subscription — cheaper for low-to-medium usage. &lt;strong&gt;AI agent design&lt;/strong&gt;: action-based API with structured error hints, optimized for LLM tool use.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I publish Skool courses programmatically?
&lt;/h3&gt;

&lt;p&gt;Yes. The &lt;code&gt;classroom:*&lt;/code&gt; actions create courses, folders, and pages. The &lt;code&gt;classroom:setBody&lt;/code&gt; action accepts markdown and converts to Skool's internal TipTap JSON format. You can publish a complete course from &lt;code&gt;.md&lt;/code&gt; files in a Git repo via CI.&lt;/p&gt;

&lt;h3&gt;
  
  
  How many Skool comments can I retrieve from a thread?
&lt;/h3&gt;

&lt;p&gt;Skool's REST endpoint for comments caps at ~35 per thread. For threads with hundreds of comments (welcome posts, AMAs), the &lt;code&gt;posts:getCommentsFull&lt;/code&gt; action uses Playwright to scroll the page and extract every comment. $0.05 per invocation but bypasses the cap entirely. Critical for community audits where you need to verify every member's introduction got a reply.&lt;/p&gt;

&lt;h3&gt;
  
  
  What happens if Skool changes their API?
&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;skool-js&lt;/code&gt; library is actively maintained. When Skool deploys a new version (typically weekly), the &lt;code&gt;buildId&lt;/code&gt; changes — the actor handles this automatically by refreshing from the homepage. WAF token expiration is handled (auto-retry with re-auth). Breaking changes are documented in the &lt;a href="https://github.com/ctala/skool-api-docs" rel="noopener noreferrer"&gt;CHANGELOG&lt;/a&gt; of the docs repo.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I expose this Skool API as an MCP server for Claude / Cursor?
&lt;/h3&gt;

&lt;p&gt;Yes. Apify exposes any public actor via &lt;code&gt;https://mcp.apify.com?tools=cristiantala/skool-all-in-one-api&lt;/code&gt;. Configure once in your MCP client (Claude Desktop, Cursor, Cline), and the model sees all 33 Skool API actions as discoverable tools. Same pay-per-event billing applies.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Actor&lt;/strong&gt;: &lt;a href="https://apify.com/cristiantala/skool-all-in-one-api" rel="noopener noreferrer"&gt;apify.com/cristiantala/skool-all-in-one-api&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Docs + recipes&lt;/strong&gt; (open, MIT): &lt;a href="https://github.com/ctala/skool-api-docs" rel="noopener noreferrer"&gt;github.com/ctala/skool-api-docs&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;n8n template (free)&lt;/strong&gt;: &lt;a href="https://n8n.io/workflows/14392-auto-approve-skool-community-members-with-gpt-4o-ai-screening/" rel="noopener noreferrer"&gt;Auto-approve members with GPT-4o&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you're operating a Skool community at any scale and this would save you time — try the actor, leave feedback in the Apify Store or open an issue in the docs repo. The pay-per-event pricing means you only pay when it's actually saving you work.&lt;/p&gt;

&lt;p&gt;If this resonated with you and you're building in public around community automation, AI agents, or Skool tooling, I'd love to hear about it. I'm building this stuff in the open at &lt;a href="https://cristiantala.com" rel="noopener noreferrer"&gt;cristiantala.com&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;— Cristian Tala&lt;/p&gt;

</description>
      <category>skool</category>
      <category>api</category>
      <category>automation</category>
      <category>typescript</category>
    </item>
    <item>
      <title>Cómo crear una landing page gratis para validar tu idea (con video tutorial y casos reales)</title>
      <dc:creator>Cristian Tala</dc:creator>
      <pubDate>Mon, 11 May 2026 20:00:04 +0000</pubDate>
      <link>https://dev.to/cristiantalasanchez/como-crear-una-landing-page-gratis-para-validar-tu-idea-con-video-tutorial-y-casos-reales-3c5n</link>
      <guid>https://dev.to/cristiantalasanchez/como-crear-una-landing-page-gratis-para-validar-tu-idea-con-video-tutorial-y-casos-reales-3c5n</guid>
      <description>&lt;p&gt;&lt;em&gt;Si estás validando una idea de negocio, **crear una landing page gratis&lt;/em&gt;* es la diferencia entre validar en horas o gastarte $50-100/mes en herramientas que no necesitas todavía. Acá está el stack completo que uso hoy en producción —incluyendo el repo público que puedes clonar—, video tutorial paso a paso, y los 3 niveles de evolución según en qué fase esté tu proyecto.*&lt;/p&gt;

&lt;h2&gt;
  
  
  Por qué la mayoría de emprendedores paga de más en la fase de validación
&lt;/h2&gt;

&lt;p&gt;Lo cuento desde mi propia experiencia: durante años yo pagaba &lt;strong&gt;$99/mes&lt;/strong&gt; en un SaaS de landing pages optimizado para performance. Bien armado, sin queja del producto. Pero cada mes el cargo aparecía y empezaba a doler — porque me daba cuenta de que estaba pagando por algo que yo mismo podía hacer con un stack abierto, en menos tiempo del que pensaba, y sin sacrificar la performance que era lo que me había llevado al SaaS en primer lugar.&lt;/p&gt;

&lt;p&gt;Cuando hice el switch al stack que comparto en este post (HTML estático generado con IA + GitHub Pages, después Astro + Cloudflare Pages para los proyectos serios), mi factura mensual de landing tools pasó de $99 a $0. Tiempo invertido en el switch: un fin de semana. Performance final: igual o mejor.&lt;/p&gt;

&lt;p&gt;Hay un patrón que veo todas las semanas en la comunidad: alguien tiene una idea, decide «validarla en serio», y antes de saber si la idea funciona ya está pagando $200 al mes en herramientas. Carrd $19, Framer $20, Webflow $29, un dominio en GoDaddy con add-ons innecesarios, Mailchimp $30, Hotjar $40, y así.&lt;/p&gt;

&lt;p&gt;Resultado típico: gasta $1,000-2,000 en los primeros tres meses y la idea ni siquiera estaba validada.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Soy fiel creyente de contratar servicios.&lt;/strong&gt; Cuando ya tienes tracción real, pagar por un stack profesional acelera todo. &lt;strong&gt;Pero soy fiel creyente también de no gastar dinero para validar ideas.&lt;/strong&gt; En fase de validación, lo que necesitas es: una página que comunique tu propuesta, capture interés, y mida si la gente reacciona. Punto. Eso se puede hacer con costo prácticamente cero.&lt;/p&gt;

&lt;p&gt;La razón por la que la mayoría igual paga $20-99/mes en SaaS de landing pages es porque nadie les contó la alternativa.&lt;/p&gt;

&lt;h2&gt;
  
  
  La filosofía: ser rata para validar, gastar bien cuando ya factures
&lt;/h2&gt;

&lt;p&gt;El frame mental que uso: en cada fase del journey, el founder pregunta dos cosas distintas.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Fase validación&lt;/strong&gt;: ¿hay demanda real? ¿alguien pagaría por esto? Lo que importa es velocidad de iteración y costo cercano a cero.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Fase tracción&lt;/strong&gt;: ¿cómo escalo lo que ya funciona? Acá sí pagas por herramientas que te ahorran tiempo y dan calidad consistente.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Mezclar las dos fases es el error más caro de bootstrapped founders. Pagás por SaaS profesionales antes de validar y, cuando la idea no resulta, sentís que «ya invertiste demasiado para abandonar». Sunk cost fallacy 101.&lt;/p&gt;

&lt;h2&gt;
  
  
  Los 3 niveles del stack según fase del proyecto
&lt;/h2&gt;

&lt;p&gt;Cuando alguien me pregunta «qué uso para mis landings», la respuesta cambia según la fase. Estos son los 3 niveles que recomiendo —y que uso yo mismo en distintos proyectos hoy mismo—:&lt;/p&gt;

&lt;h3&gt;
  
  
  Nivel 1 — Validar rápido (HTML + IA + GitHub Pages)
&lt;/h3&gt;

&lt;p&gt;Para cuando tienes una idea cruda y quieres saber si alguien levanta la mano antes de invertir más tiempo o dinero.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Stack&lt;/strong&gt;: prompt a Gemini/Claude/ChatGPT → te devuelve un único &lt;code&gt;index.html&lt;/code&gt; estático → subes a un repo público de GitHub → activas GitHub Pages → SSL automático → opcionalmente conectas un dominio personalizado vía Cloudflare DNS.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Tiempo&lt;/strong&gt;: 18-30 minutos para landing + dominio personalizado.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Costo&lt;/strong&gt;: $0 si usas el subdominio &lt;code&gt;usuario.github.io/repo&lt;/code&gt;, o ~$10/año si compras un dominio.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Cuándo usarlo&lt;/strong&gt;: validación cero-a-uno, MVP de marketing, lead magnet rápido, landing para un experimento de paid ads chico.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Este es el nivel que cubro en el video tutorial más abajo.&lt;/p&gt;

&lt;h3&gt;
  
  
  Nivel 2 — Landing pulida (Astro + GitHub Pages o Cloudflare Pages)
&lt;/h3&gt;

&lt;p&gt;Para cuando la idea validó, quieres algo con SEO técnico serio y la landing va a evolucionar (agregar testimonios, casos, secciones nuevas).&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Stack&lt;/strong&gt;: &lt;a href="https://astro.build" rel="noopener noreferrer"&gt;Astro&lt;/a&gt; como framework + GitHub Pages o Cloudflare Pages como hosting.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Por qué Astro&lt;/strong&gt;: genera HTML estático en build time, zero JS cliente innecesario, performance brutal (LCP&lt;br&gt;&lt;br&gt;
«Necesito el HTML completo de una landing page para validar una idea de negocio. La idea es: [DESCRIBÍ EN 2-3 FRASES]. Audiencia objetivo: [QUIÉN]. La landing debe incluir: hero con CTA principal, 3 secciones de beneficios, formulario de captura de email, footer simple. Estilo: moderno, minimalista, mobile-first. Devolveme un único archivo index.html con todo embedded: HTML, CSS y JS. Sin frameworks pesados (nada de React, solo HTML estático con JS vanilla). Optimizado para cargar en menos de 200ms.»&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Lo importante: pídele HTML único y estático. &lt;strong&gt;Si la IA te devuelve un proyecto con npm, package.json y carpetas, dile que NO&lt;/strong&gt;, quieres un solo &lt;code&gt;index.html&lt;/code&gt; con todo incluido. Eso es lo que GitHub Pages puede servir directo.&lt;/p&gt;

&lt;p&gt;Tip: si después de generar quieres ajustes, pégale un screenshot del resultado y dile &lt;em&gt;«esta parte de acá cambia esto»&lt;/em&gt;. Funciona mucho mejor que describir con palabras.&lt;/p&gt;

&lt;h3&gt;
  
  
  Paso 2: Crear repo público en GitHub (3 min)
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Crear cuenta en github.com si no tienes&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;New repository → nombre tipo &lt;code&gt;landing-mi-idea&lt;/code&gt; → &lt;strong&gt;público&lt;/strong&gt; → Create&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Click en «uploading an existing file» o «Add file → Create new file»&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Nombre del archivo: &lt;code&gt;index.html&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Pegar el HTML que te dio la IA&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Commit&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Paso 3: Activar GitHub Pages (2 min)
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;En el repo, ir a &lt;strong&gt;Settings → Pages&lt;/strong&gt; (sidebar izquierdo)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;En «Source», elegir branch &lt;code&gt;main&lt;/code&gt; y carpeta &lt;code&gt;/ (root)&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Save&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Esperar 1-2 minutos&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;URL queda activa en: &lt;code&gt;https://tuusuario.github.io/landing-mi-idea/&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Ya tienes landing online, gratis, con SSL automático.&lt;/p&gt;

&lt;h3&gt;
  
  
  Paso 4 (opcional pero recomendado): Conectar dominio personalizado vía Cloudflare (5 min)
&lt;/h3&gt;

&lt;p&gt;Esto agrega 5 minutos pero da credibilidad real (URL profesional vs &lt;code&gt;usuario.github.io/repo&lt;/code&gt;).&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Si todavía no tienes un dominio, cómpralo (en Cloudflare Registrar son de los más baratos sin upsells: $9-12/año típico)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;En tu DNS de Cloudflare, crear un &lt;strong&gt;CNAME record&lt;/strong&gt;: nombre &lt;code&gt;validar&lt;/code&gt; (o lo que quieras como subdominio) → destino &lt;code&gt;tuusuario.github.io&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;En GitHub, &lt;strong&gt;Settings → Pages → Custom domain&lt;/strong&gt;: pegar &lt;code&gt;validar.tudominio.com&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Esperar 5-15 minutos a que se genere el certificado SSL automáticamente&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Ya tienes landing con dominio personalizado, SSL, gratis. Total invertido: ~$10/año del dominio.&lt;/p&gt;

&lt;h2&gt;
  
  
  Video tutorial paso a paso (Nivel 1 en vivo)
&lt;/h2&gt;

&lt;p&gt;Acá te dejo el tutorial completo en vivo donde lo hicimos con Rodrigo, levantando una landing real (&lt;code&gt;bananas.cristiantala.com&lt;/code&gt;) en 18 minutos. Verlo te ahorra mucho del trial-and-error del primer intento:&lt;/p&gt;

&lt;h2&gt;
  
  
  Casos reales en producción que puedes inspeccionar
&lt;/h2&gt;

&lt;p&gt;Acá están los 3 sitios que opero hoy con este stack —en distintos niveles— por si quieres ver qué se puede hacer:&lt;/p&gt;

&lt;h3&gt;
  
  
  Caso 1 — &lt;code&gt;lp.cristiantala.com&lt;/code&gt; (Nivel 2)
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://lp.cristiantala.com" rel="noopener noreferrer"&gt;lp.cristiantala.com&lt;/a&gt; es el dominio donde hosteo todas mis landings de marketing: lead magnets, lanzamientos, cheatsheets descargables. Stack: Astro + Cloudflare Pages.&lt;/p&gt;

&lt;p&gt;Ejemplo concreto: &lt;a href="https://lp.cristiantala.com/linkedin-cheatsheets/" rel="noopener noreferrer"&gt;lp.cristiantala.com/linkedin-cheatsheets/&lt;/a&gt; es la landing del cheatsheet del benchmark IA mensual que distribuyo. Performance LCP  SEO &amp;gt; mantenibilidad &amp;gt; diseño, en ese orden) y usarlo como template para tu propio sitio agéntico.&lt;/p&gt;

&lt;p&gt;Lo que vale la pena copiar de ese repo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;CLAUDE.md&lt;/code&gt;: cómo definir reglas duras de proyecto que el agente respeta&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;.claude/agents/&lt;/code&gt;: cómo modelar agentes custom para tareas repetibles&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;scripts/indexnow.sh&lt;/code&gt;: cómo notificar a buscadores cuando publicas contenido nuevo (clave para indexación rápida)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;scripts/validate-build.sh&lt;/code&gt;: validar antes de cada deploy&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Caso 3 — Tu primera landing (Nivel 1)
&lt;/h3&gt;

&lt;p&gt;Esta es la que vas a hacer si sigues el tutorial del video. Empieza simple, valida rápido, después escala si la idea funciona.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lo que SÍ necesita una landing de validación (no negociable)
&lt;/h2&gt;

&lt;p&gt;Una landing técnicamente perfecta pero que no captura datos no sirve para validar. Estos son los 4 elementos no negociables:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. CTA único y claro
&lt;/h3&gt;

&lt;p&gt;Una sola acción que el visitante debe hacer. Punto. No «compra Y suscribite Y compartí Y miranos en Instagram». Una acción.&lt;/p&gt;

&lt;p&gt;Para validación, el CTA típico es: capturar email para waitlist, o pre-orden con pago real (más fuerte como señal).&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Captura de email funcional
&lt;/h3&gt;

&lt;p&gt;Conectar un formulario que efectivamente guarde el email en algún lado. Opciones gratis: Listmonk self-hosted, Tally + Google Sheets, ConvertKit free tier (hasta 1,000 subs), Brevo free tier (hasta 300 emails/día).&lt;/p&gt;

&lt;p&gt;El que uso yo: &lt;strong&gt;Listmonk&lt;/strong&gt; self-hosted. Costo cero, control total. Si recién empiezas y no quieres tocar servidores: Tally + Google Sheets es lo más simple.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Tracking básico
&lt;/h3&gt;

&lt;p&gt;Saber cuántos visitantes recibís + dónde están + qué porcentaje convierte. Opciones gratis:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Cloudflare Web Analytics&lt;/strong&gt; (gratis si ya estás en Cloudflare, lo más fácil)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Google Analytics 4&lt;/strong&gt; (gratis, completo pero pesado en privacy)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Plausible&lt;/strong&gt; (gratis self-hosted, simple y privacy-friendly)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sin tracking no estás validando, estás adivinando.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Meta tags básicos para SEO/social
&lt;/h3&gt;

&lt;p&gt;Cuando alguien comparta tu landing en LinkedIn / WhatsApp / Twitter, quieres que se vea bien (Open Graph). Mínimo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;&amp;lt;title&amp;gt;&lt;/code&gt; con la propuesta principal&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;&amp;lt;meta description&amp;gt;&lt;/code&gt; clara y atractiva&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;og:image&lt;/code&gt; con una imagen (1200×630 recomendado)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;og:title&lt;/code&gt; y &lt;code&gt;og:description&lt;/code&gt; para social shares&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pedile esto a la IA en el prompt original y te lo deja listo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Las 3 métricas que dicen «sí valida» vs «no valida»
&lt;/h2&gt;

&lt;p&gt;Después de 1-2 semanas con la landing live y tráfico inicial (mín 100-200 visitantes), mira:&lt;/p&gt;

&lt;h3&gt;
  
  
  Métrica 1: Conversion rate de visitante a email
&lt;/h3&gt;

&lt;p&gt;Benchmark realista:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;5%&lt;/strong&gt;: señal fuerte&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Métrica 2: Calidad de los emails capturados
&lt;/h3&gt;

&lt;p&gt;¿Son personas reales con perfil de tu cliente target? Si capturas 200 emails pero el 80% son founders mirando «cómo lo hizo este» en vez de tu cliente target, no validaste demanda real.&lt;/p&gt;

&lt;h3&gt;
  
  
  Métrica 3: Pre-órdenes o «yo pago ya»
&lt;/h3&gt;

&lt;p&gt;La más fuerte. Si en el CTA pedís pre-pago o señal con pago, cada conversión vale 10× una captura de email. Conversion rate baja a 0.5-2%, pero cada uno es señal sólida.&lt;/p&gt;

&lt;h2&gt;
  
  
  Los 3 errores más comunes que veo en landings de validación
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Tráfico cero con expectativa de validar.&lt;/strong&gt; La landing perfecta sin tráfico no valida nada. Mínimo: $50-100 en Twitter/LinkedIn ads o tráfico orgánico de tu red, para tener 100-200 visitantes mínimo antes de sacar conclusiones.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;CTA confuso o múltiple.&lt;/strong&gt; «Suscríbete o agendá demo o miranos en redes» mata el conversion rate. Una acción.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;No iterar.&lt;/strong&gt; Si después de 200 visitantes tienes 1% conversion, no esperes a 1000 visitantes para cambiar. Iterá hero, copy, propuesta. La landing es un experimento, no un monumento.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Cuándo subir de Nivel 1 a Nivel 2 o 3
&lt;/h2&gt;

&lt;p&gt;No subas de nivel antes de tiempo. Las señales claras para graduar:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;De Nivel 1 a Nivel 2&lt;/strong&gt; (HTML simple → Astro):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;La idea ya validó (&amp;gt;3% conversion sostenido)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Vas a invertir tiempo en hacer la landing «definitiva»&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Necesitás múltiples páginas (about, pricing, casos, blog)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;SEO empieza a importarte como canal de adquisición&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;De Nivel 2 a Nivel 3&lt;/strong&gt; (Astro manual → Astro agéntico):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Publicás contenido recurrentemente (semanal, quincenal)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Estás copiando-pegando setups entre páginas&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;El 70% del trabajo de «agregar contenido» es repetitivo&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Querés que un agente se encargue de la metadata SEO y validaciones&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Si todavía no validaste la idea, &lt;strong&gt;mantente en Nivel 1&lt;/strong&gt;. Subir de nivel antes es over-engineering y consume tiempo que necesitas para hablar con tus primeros clientes.&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Y ahora qué?
&lt;/h2&gt;

&lt;p&gt;Si seguiste los pasos del Nivel 1, ya tienes tu primera landing online por $0 (o ~$10/año si conectaste un dominio). Si quieres ver cómo se ve esto cuando escala, te dejé los 2 sitios reales arriba —incluyendo el repo público de ELHDA que puedes clonar—.&lt;/p&gt;

&lt;p&gt;El siguiente paso es &lt;strong&gt;traerle tráfico real y medir&lt;/strong&gt;. Eso es la parte que requiere más arte que técnica.&lt;/p&gt;

&lt;p&gt;Dentro de &lt;a href="https://www.skool.com/cagala-aprende-repite/about?ref=blog-landing&amp;amp;utm_source=blog&amp;amp;utm_medium=organic&amp;amp;utm_campaign=cluster-founder-ia&amp;amp;utm_content=cta-fin" rel="noopener noreferrer"&gt;Cágala, Aprende, Repite&lt;/a&gt; tenemos founders compartiendo casos reales de validación: landings que funcionaron, landings que fallaron y qué iteraciones llevaron al «sí valida». Si estás en fase de validación, esa data te ahorra meses de trial-and-error solo.&lt;/p&gt;

&lt;p&gt;Entrás gratis, descargás el template HTML como recurso de bienvenida, y si te suma el resto te quedás.&lt;/p&gt;

&lt;p&gt;— Cristian&lt;/p&gt;

&lt;h2&gt;
  
  
  Preguntas frecuentes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ¿Cuánto cuesta crear una landing page gratis con GitHub Pages?
&lt;/h3&gt;

&lt;p&gt;Cero pesos si usas un subdominio de GitHub (&lt;code&gt;tuusuario.github.io/turepo&lt;/code&gt;). Si conectas un dominio personalizado, solo pagas el dominio (típico $9-12/año en Cloudflare Registrar). El hosting + SSL + ancho de banda son gratis. Para sitios con tráfico moderado (decenas de miles de visitas/mes) sigue siendo gratis.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Astro o HTML simple para una landing?
&lt;/h3&gt;

&lt;p&gt;Depende de la fase:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;HTML simple&lt;/strong&gt;: validación cero-a-uno. Una sola página, copy estático. 18 min y listo.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Astro&lt;/strong&gt;: post-validación o sitios que evolucionan. Mejor performance, mejor SEO, más mantenible si vas a agregar páginas. Requiere 2-4h de setup inicial.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Si recién empiezas: HTML simple. Si ya validaste o el sitio va a crecer: Astro.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿GitHub Pages o Cloudflare Pages: cuál usar?
&lt;/h3&gt;

&lt;p&gt;Para empezar y validar: &lt;strong&gt;GitHub Pages&lt;/strong&gt;. Es más simple de configurar, todo en una plataforma.&lt;/p&gt;

&lt;p&gt;Para producción seria, especialmente con Astro: &lt;strong&gt;Cloudflare Pages&lt;/strong&gt;. Performance superior (CDN global más rápido), mejor analytics nativo, integración directa con DNS Cloudflare. Lo que uso yo en &lt;code&gt;lp.cristiantala.com&lt;/code&gt; y &lt;code&gt;eslahoradeaprender.com&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Necesito saber programar para crear una landing con IA + GitHub Pages?
&lt;/h3&gt;

&lt;p&gt;No para el Nivel 1. Pedile a Gemini, Claude o ChatGPT el HTML completo. Después es solo copy-paste a GitHub. Lo único técnico es activar Pages en Settings, que son 3 clicks. Si nunca tocaste GitHub, el primer intento te toma 30-45 min. El segundo, 10 min.&lt;/p&gt;

&lt;p&gt;Para Nivel 2 (Astro) sí ayuda saber lo básico de cómo correr &lt;code&gt;npm install&lt;/code&gt; y &lt;code&gt;npm run build&lt;/code&gt;. Para Nivel 3 (agéntico) ayuda haber usado Claude Code antes.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Qué es un sistema «agéntico» para mantener un sitio?
&lt;/h3&gt;

&lt;p&gt;Un sistema donde uno o más agentes IA (típicamente Claude Code con prompts custom) se encargan de tareas repetitivas: agregar contenido nuevo, generar metadata SEO, validar builds, notificar a buscadores. El humano define las reglas (en archivos como &lt;code&gt;CLAUDE.md&lt;/code&gt;) y el agente las ejecuta.&lt;/p&gt;

&lt;p&gt;Caso real público: &lt;a href="https://github.com/ctala/landing-es-la-hora-de-aprender" rel="noopener noreferrer"&gt;github.com/ctala/landing-es-la-hora-de-aprender&lt;/a&gt; — el sitio del podcast Es La Hora de Aprender, donde agregar un episodio nuevo es 1 comando que el agente ejecuta de punta a punta.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Puedo conectar un dominio que ya tengo a GitHub Pages?
&lt;/h3&gt;

&lt;p&gt;Sí. En tu DNS, agregas un CNAME que apunte a &lt;code&gt;tuusuario.github.io&lt;/code&gt;, después en Settings → Pages → Custom Domain pones tu dominio. SSL automático. Demora 5-15 min en propagar. Funciona igual con Cloudflare DNS si tienes el dominio ahí.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Para qué NO sirve este stack (GitHub Pages / Astro)?
&lt;/h3&gt;

&lt;p&gt;Para sitios con backend (procesar pagos directo, base de datos, autenticación de usuarios), e-commerce complejo, o aplicaciones SaaS. Para todo eso necesitas server real (Vercel, Railway, AWS, etc.). Para landing pages, blogs, sitios de podcast, sitios de producto estáticos, es ideal.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Qué herramientas uso para email capture y tracking?
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Email capture&lt;/strong&gt;: Listmonk (self-hosted, gratis), Tally + Google Sheets (sin backend), ConvertKit free tier (hasta 1,000 subs), Brevo free tier (300 emails/día).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tracking&lt;/strong&gt;: Cloudflare Web Analytics (gratis si estás en CF), Google Analytics 4 (gratis pero pesado), Plausible (privacy-friendly).&lt;/p&gt;

&lt;p&gt;The post &lt;a href="https://cristiantala.com/landing-page-gratis-validar-idea-emprendedor/" rel="noopener noreferrer"&gt;Cómo crear una landing page gratis para validar tu idea (con video tutorial y casos reales)&lt;/a&gt; appeared first on &lt;a href="https://cristiantala.com" rel="noopener noreferrer"&gt;Cristian Tala Sánchez&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Este articulo fue publicado originalmente en &lt;a href="https://cristiantala.com/landing-page-gratis-validar-idea-emprendedor/?utm_source=devto&amp;amp;utm_medium=syndication" rel="noopener noreferrer"&gt;cristiantala.com&lt;/a&gt;. Si te interesa emprendimiento, IA y automatizacion, unite gratis a la comunidad &lt;a href="https://www.skool.com/cagala-aprende-repite?utm_source=devto&amp;amp;utm_medium=syndication" rel="noopener noreferrer"&gt;Cagala, Aprende, Repite&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>devops</category>
      <category>ia</category>
      <category>startup</category>
    </item>
    <item>
      <title>El verdadero gap de la IA en LATAM no es la tecnología</title>
      <dc:creator>Cristian Tala</dc:creator>
      <pubDate>Mon, 11 May 2026 19:00:04 +0000</pubDate>
      <link>https://dev.to/cristiantalasanchez/el-verdadero-gap-de-la-ia-en-latam-no-es-la-tecnologia-47pk</link>
      <guid>https://dev.to/cristiantalasanchez/el-verdadero-gap-de-la-ia-en-latam-no-es-la-tecnologia-47pk</guid>
      <description>&lt;p&gt;&lt;strong&gt;67%&lt;/strong&gt; de las grandes empresas de LATAM tienen al menos un proyecto de IA en producción. Solo &lt;strong&gt;23%&lt;/strong&gt; reporta impacto medible en métricas de negocio.&lt;/p&gt;

&lt;p&gt;Esa brecha de 44 puntos es el verdadero estado de la IA empresarial en la región. No es un problema de tecnología — el mercado tiene Claude, GPT, Gemini, MiniMax, modelos open source corriendo en cualquier laptop decente. Es un problema de ejecución, calidad de datos y decisiones que se toman antes de elegir un modelo.&lt;/p&gt;

&lt;h2&gt;
  
  
  El número que nadie quiere mirar
&lt;/h2&gt;

&lt;p&gt;Tres datos definen el momento:&lt;/p&gt;

&lt;p&gt;El primer número se lee bonito en conferencias. El segundo es el que importa. El tercero es la señal de hacia dónde va la siguiente ola.&lt;/p&gt;

&lt;p&gt;Brasil concentra la inversión empresarial más alta: las grandes corporaciones gastan en promedio &lt;strong&gt;R$77.7M anuales&lt;/strong&gt; en AI, con un ROI actual del 16% que esperan llevar al 31% para 2027 (SAP + Oxford Economics). En Nubank el AI ya está dentro del credit underwriting; PicPay, PagSeguro y Creditas tienen agentes de fraude y compliance corriendo todos los días. En fintech, el ROI promedio del primer año en sistemas de credit scoring y fraud detection con AI es de &lt;strong&gt;3.2×&lt;/strong&gt;. Eso es producción real, no slide deck.&lt;/p&gt;

&lt;p&gt;Pero esos casos son la minoría. La mayoría sigue atrapada en pilotos.&lt;/p&gt;

&lt;h2&gt;
  
  
  El gap no es la tecnología — es la ejecución
&lt;/h2&gt;

&lt;p&gt;Cuando le pregunto a founders y CTOs por qué su piloto de IA no se escaló, las respuestas se repiten:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;«Los datos están sucios y fragmentados.»&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;«No teníamos a alguien que entendiera cuándo el modelo se equivocaba.»&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;«El costo de mantener el agente subió cuando el proveedor cambió las reglas.»&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;«Empezamos con OpenAI, después Claude, después no sabíamos cuál era el dueño del workflow.»&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ninguna de esas respuestas habla del modelo. Hablan de &lt;strong&gt;gobernanza del flujo&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Tres cosas determinan si un proyecto de IA llega a producción con impacto medible:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Calidad y disponibilidad del dato.&lt;/strong&gt; Sin esto, ningún modelo te salva. El 80% del costo de un proyecto productivo es preparar el dato.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Métrica clara que defienda el caso de uso.&lt;/strong&gt; Si no podés decir qué KPI mueve el agente, no debería estar en el P&amp;amp;L.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Independencia del proveedor.&lt;/strong&gt; El día que el proveedor te cambia el precio o saca una feature del plan, tu unit economics se rompe — y eso no es hipotético.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;El último punto es donde el 38% que está migrando a open source está jugando distinto.&lt;/p&gt;

&lt;h2&gt;
  
  
  Por qué 38% ya está en open source
&lt;/h2&gt;

&lt;p&gt;En abril 2026 Anthropic sacó silenciosamente a Claude Code del plan Pro de $20. Lo restauraron 24 horas después por presión pública, pero el experimento existió: la pricing page completa decía X, no un test del 2% como después intentaron explicar. Amol Avasare (Head of Growth) tuvo que admitirlo en X.&lt;/p&gt;

&lt;p&gt;Ese día quedó claro algo que las empresas con stack robusto ya sabían: &lt;strong&gt;un proveedor, un punto de falla&lt;/strong&gt;. Y no importa que tu suscripción cueste $20 o $100 — el riesgo no es el costo, es que las reglas pueden cambiar un martes cualquiera.&lt;/p&gt;

&lt;p&gt;El 38% que migró parcial o totalmente a AI open source no es por ideología — es por unit economics. Modelos como Llama, Qwen, DeepSeek, Mistral corren localmente, no dependen de un dashboard externo, y la cuota la define tu hardware, no el contrato.&lt;/p&gt;

&lt;p&gt;Mi setup personal lo refleja: corro &lt;strong&gt;MiniMax M2.7 highspeed&lt;/strong&gt; ($40/mes, cuota infinita en uso real) en paralelo a Claude Code, con Ollama Cloud para producción y una NVIDIA DGX Spark local para correr Qwen 3.6 cuando la privacidad o el costo es crítico. No es por hobby — es porque el día que cualquiera de esos proveedores mueva el queso, el resto del stack sigue funcionando.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cómo se ve un proyecto que sí llega a producción
&lt;/h2&gt;

&lt;p&gt;Hay un patrón común en los casos que llegan al 23% con impacto medible:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Vertical bien definido.&lt;/strong&gt; No «vamos a usar IA»; sí «vamos a automatizar el scoring de microcréditos con datos transaccionales + telco». Ámbito acotado, métrica clara.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Data pipeline antes que modelo.&lt;/strong&gt; Limpieza, enriquecimiento, governance. El modelo viene después.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Multi-modelo desde el día 1.&lt;/strong&gt; Un primario, un secundario, un fallback open source. Cero proveedor exclusivo.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Métrica de negocio, no técnica.&lt;/strong&gt; No «accuracy del 92%»; sí «reducción de fraude en X% sostenida tres meses».&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Humano en el loop al principio.&lt;/strong&gt; Aprobación, corrección, retroalimentación que mejora el agente.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Costos medidos por unidad de negocio.&lt;/strong&gt; No «$200/mes en API»; sí «$0.03 por transacción procesada».&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;JPMorgan (que no es LATAM pero es el benchmark que cualquier banco regional compara) lo hace exactamente así: $17.5B de presupuesto tecnológico anual, 450+ casos de uso en producción, 200,000 empleados usando su LLM Suite a diario. La meta declarada es $2.5B de valor anual de AI. Nadie llega ahí «probando OpenAI».&lt;/p&gt;

&lt;h2&gt;
  
  
  Lo que viene en LATAM Q3-Q4 2026
&lt;/h2&gt;

&lt;p&gt;Tres movimientos a observar:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Verticales reguladas migran a open source.&lt;/strong&gt; Fintech y healthcare van a forzar setups híbridos por compliance — open source local + APIs externas solo donde la regulación lo permite.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;El presupuesto AI deja de ser «proyecto» y pasa a «capacidad continua».&lt;/strong&gt; Las empresas que lo traten como CapEx (gasto único) se quedarán atrás. Las que lo traten como OpEx con métricas mensuales van a capitalizar.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;El gap de talento se cierra con templates probados.&lt;/strong&gt; No con frameworks teóricos — con repositorios open source que muestren el código real de cómo un agente productivo está armado.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;El 23% que mide impacto va a crecer. La pregunta es si vas a ser parte de ese 23% o seguir en el 44% que adopta sin medir.&lt;/p&gt;

&lt;p&gt;The post &lt;a href="https://cristiantala.com/el-verdadero-gap-de-la-ia-en-latam-no-es-la-tecnologia/" rel="noopener noreferrer"&gt;El verdadero gap de la IA en LATAM no es la tecnología&lt;/a&gt; appeared first on &lt;a href="https://cristiantala.com" rel="noopener noreferrer"&gt;Cristian Tala Sánchez&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Este articulo fue publicado originalmente en &lt;a href="https://cristiantala.com/el-verdadero-gap-de-la-ia-en-latam-no-es-la-tecnologia/?utm_source=devto&amp;amp;utm_medium=syndication" rel="noopener noreferrer"&gt;cristiantala.com&lt;/a&gt;. Si te interesa emprendimiento, IA y automatizacion, unite gratis a la comunidad &lt;a href="https://www.skool.com/cagala-aprende-repite?utm_source=devto&amp;amp;utm_medium=syndication" rel="noopener noreferrer"&gt;Cagala, Aprende, Repite&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ia</category>
    </item>
    <item>
      <title>Cómo construí una comunidad de founders sin sentirme un estafador</title>
      <dc:creator>Cristian Tala</dc:creator>
      <pubDate>Mon, 11 May 2026 16:00:04 +0000</pubDate>
      <link>https://dev.to/cristiantalasanchez/como-construi-una-comunidad-de-founders-sin-sentirme-un-estafador-g1g</link>
      <guid>https://dev.to/cristiantalasanchez/como-construi-una-comunidad-de-founders-sin-sentirme-un-estafador-g1g</guid>
      <description>&lt;p&gt;&lt;em&gt;Construir una **comunidad para emprendedores con IA&lt;/em&gt;* y monetizarla siempre me generó la misma tensión: cobrarle a quien recién empieza se siente horrible, y cobrarle al que ya puede pagar no me molesta. Después de cinco años, encontré el sistema que resuelve esa tensión. Hoy clarifiqué cómo funciona, para mí y para todos los que están dentro.*&lt;/p&gt;

&lt;h2&gt;
  
  
  El problema que arrastré 5 años: ¿cómo cobrar una mentoría sin sentirme impostor?
&lt;/h2&gt;

&lt;p&gt;Llevo cinco años pensando cómo apoyar a otros founders y emprendedores sin sentirme un estafador.&lt;/p&gt;

&lt;p&gt;No es una frase de marketing. Es literal. Cada vez que alguien me preguntaba &lt;em&gt;cuánto te cobro por una sesión&lt;/em&gt;, sentía un nudo. No por el monto. Por la pregunta de fondo: ¿le estoy cobrando a alguien que todavía no puede pagarme, o a alguien que ya puede y para quien esto no significa nada?&lt;/p&gt;

&lt;p&gt;Cobrarle a quien todavía no puede pagarte se siente horrible. A quien ya puede pagar, nunca me molestó. El problema es que la mayoría de los formatos clásicos —mentorías 1:1, cursos cerrados con pricing único, programas pagados— no distinguen entre los dos. Le cobran lo mismo al founder que ya facturó $1M ARR que al emprendedor que está validando una idea en una hoja de Notion.&lt;/p&gt;

&lt;p&gt;Encontrar ese equilibrio me tomó años. Hoy lo encontré.&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Comunidad pagada o gratuita? El reset que cambió todo
&lt;/h2&gt;

&lt;p&gt;Hace cuatro o cinco meses dejé de pensar en CAR (&lt;a href="https://www.skool.com/cagala-aprende-repite/about" rel="noopener noreferrer"&gt;Cágala, Aprende, Repite&lt;/a&gt;) como «comunidad pagada» o «comunidad gratuita». Esa dicotomía es justo el problema.&lt;/p&gt;

&lt;p&gt;Empecé a pensarla como una &lt;strong&gt;comunidad para emprendedores con un sistema de progresión&lt;/strong&gt;. Como un videojuego, pero para emprendimiento.&lt;/p&gt;

&lt;p&gt;La idea es vieja —el modelo freemium con gamification existe hace años en Skool, Discord, Reddit—. Lo nuevo, al menos para mí, fue darme cuenta de que el sistema de progresión podía resolver exactamente esa tensión que arrastraba:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Los que recién empiezan, entran gratis y desbloquean conocimiento &lt;strong&gt;aportando&lt;/strong&gt; —comentando, posteando, ayudando a otros, participando en eventos—. No pagan nada.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Los que ya pueden pagar y quieren ir más profundo —tiempo real conmigo, eventos en vivo, asesorías grabadas, biblioteca premium— pagan. Y ese pago no compra el conocimiento (el conocimiento ya está adentro). Compra &lt;strong&gt;mi tiempo&lt;/strong&gt; y los recursos curados que uso a diario para correr mis empresas.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Es la misma comunidad. Es el mismo conocimiento. Lo que cambia es la velocidad y la profundidad del acceso, según en qué punto del journey estés.&lt;/p&gt;

&lt;h2&gt;
  
  
  Por qué una comunidad para emprendedores con IA tiene sentido en 2026
&lt;/h2&gt;

&lt;p&gt;Hay una segunda razón por la que recién ahora se materializó este modelo: la forma de emprender ya cambió.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Emprender en 2026 sin apalancar IA es como hacerlo en 2010 sin internet.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;No es una opinión. Es una realidad operativa que vivo cada día corriendo &lt;a href="https://ecosistemastartup.com" rel="noopener noreferrer"&gt;Ecosistema Startup&lt;/a&gt; (200K visitas/mes &lt;a href="https://cristiantala.com/como-automatice-1000-ctas-en-mi-blog-sin-escribir-una-linea-de-codigo/" rel="noopener noreferrer"&gt;con un equipo de 1 persona + IA&lt;/a&gt;) y la comunidad de CAR.&lt;/p&gt;

&lt;p&gt;Hoy un founder puede:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://cristiantala.com/mvp-sin-programar-2026-guia-completa/" rel="noopener noreferrer"&gt;Validar una landing en 2 horas&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Automatizar customer support con &lt;a href="https://cristiantala.com/openclaw-n8n-automatizacion-agentes-ia/" rel="noopener noreferrer"&gt;un agente IA en producción&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Producir contenido sin contratar a nadie&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://cristiantala.com/2026-mi-ano-sin-bullshit/" rel="noopener noreferrer"&gt;Operar una empresa con un equipo mínimo&lt;/a&gt; sin sacrificar la calidad de lo que sale&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;La pregunta ya no es &lt;strong&gt;si&lt;/strong&gt; se usa IA. Es &lt;strong&gt;cómo&lt;/strong&gt;. Y la respuesta no la encuentras leyendo papers ni en cursos de gurús que nunca operaron una empresa. La encuentras en una comunidad donde otros founders están aplicando esto en producción, compartiendo qué funciona y qué no, sin filtro.&lt;/p&gt;

&lt;p&gt;El stack que uso para operar Ecosistema Startup y la comunidad CAR no es secreto: n8n para automatizaciones, agentes IA con Claude/Qwen para contenido y soporte, OpenClaw como mano derecha, NocoDB como fuente de verdad. Esto es lo que enseño dentro de la comunidad — no como teoría, como playbooks que uso hoy.&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Por qué Skool y no Circle, Teachable, Hotmart o Discord?
&lt;/h2&gt;

&lt;p&gt;Antes de quedarme con &lt;a href="https://www.skool.com/signup?ref=114150f098fc40ba9b365fa78be01a63" rel="noopener noreferrer"&gt;Skool&lt;/a&gt; probé varias plataformas. Vale la pena contar qué pasó con cada una, porque la pregunta «qué plataforma uso para mi comunidad» la tengo seguido en el WhatsApp y la respuesta no es obvia.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Teachable.&lt;/strong&gt; Es buenísimo como LMS para vender cursos, pero no es una comunidad. Es un repositorio de videos con foro adjunto. Si tu producto es «el curso», funciona. Si tu producto es «la gente que entra al curso», no. Para CAR necesitaba la comunidad como protagonista, no el curso.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hotmart.&lt;/strong&gt; Plataforma de pago + cursos muy fuerte en LATAM, pero mi experiencia fue paupérrima — UI sobrecargada, soporte mediocre, fees altos, y la comunidad como tal es accesoria. El golpe final fue que &lt;strong&gt;me debían dinero y me aburrí de pedirlo&lt;/strong&gt;. Si vas a confiar en una plataforma para manejar tu monetización, lo mínimo no negociable es que te paguen lo que generaste, cuando corresponde. Funciona si tu modelo es vender infoproductos individuales con afiliados y tienes paciencia infinita para reclamos. No funciona si tu modelo es comunidad recurrente.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Circle.&lt;/strong&gt; Acá la cosa fue interesante. Circle me gustó genuinamente — UI limpia, features potentes (DMs, eventos, cursos integrados, segmentación), branding propio. Pero &lt;strong&gt;las personas no interactuaban como deberían&lt;/strong&gt;. La fricción del onboarding (cuenta nueva, app aparte, no hay efecto red) hacía que entraran, miraran y se fueran. El engagement nunca despegó. Para alguien que recién está construyendo audiencia, ese costo de adopción mata el sistema.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Discord.&lt;/strong&gt; Excelente para chat en tiempo real, voice channels y comunidades de gaming/dev. Pero para una &lt;strong&gt;comunidad de emprendedores con sistema de progresión&lt;/strong&gt;, falla en tres cosas: 1) la gamification nativa es básica (sin niveles, sin desbloqueo de contenido), 2) los cursos hay que hostearlos afuera y romper el flujo, 3) el ruido del chat constante mata el deep work.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Skool gana por dos razones contraintuitivas.&lt;/strong&gt; Una es que &lt;strong&gt;tiene pocas funcionalidades&lt;/strong&gt; —comparado con Circle es casi austero— y eso es exactamente lo que la hace simple para gente no técnica. La curva de aprendizaje es cero: feed, cursos, eventos, classroom. Punto. Sin paneles avanzados, sin segmentaciones complicadas, sin features que nadie usa. La otra es &lt;strong&gt;network effect&lt;/strong&gt;: hay buena probabilidad de que la persona que invitás a CAR ya tenga cuenta en Skool porque pertenece a otra comunidad (ej. SchoolOfMentors, Imperio, Agentic Architects). Eso reduce la fricción del onboarding a casi cero. Y la gamificación nativa (niveles, puntos, leaderboard que premian aportar) más el &lt;a href="https://cristiantala.com/automatizar-skool-onboarding-n8n-apify-138-miembros-perdidos/" rel="noopener noreferrer"&gt;transaction fee 2.9%&lt;/a&gt; vs 14% Patreon, terminan de cerrar la decisión.&lt;/p&gt;

&lt;p&gt;En resumen: si tu modelo es freemium con progresión por niveles y cursos desbloqueables, Skool gana. Si tu valor principal es chat en vivo permanente, Discord. Si quieres customización máxima y tu audiencia ya está adentro de tu marca, Circle. Si tu producto es el curso individual y no la comunidad, Teachable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cómo funciona el modelo freemium con gamification en mi comunidad de Skool
&lt;/h2&gt;

&lt;p&gt;Para que no quede en abstracto, así funciona hoy la comunidad de CAR:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Si entras gratis&lt;/strong&gt;, tienes acceso al feed, a la mayoría de eventos comunitarios y a los cursos del journey de founder (validación de ideas, pricing, marca personal, n8n, agentes IA, fundraising, postular a fondos públicos). Cada curso se desbloquea al subir de nivel &lt;strong&gt;aportando&lt;/strong&gt; a la comunidad. Si comentas, posteas, ayudas a otros — desbloqueas.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Si quieres ir más profundo&lt;/strong&gt;, hay dos tiers de pago: Premium y VIP.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Premium&lt;/strong&gt; te da acceso inmediato a todos los cursos sin esperar niveles, el Cofre del Pirata completo (la biblioteca con prompts, workflows n8n, AGENTS.md templates, plantillas, cheatsheets y playbooks que uso a diario para correr mis empresas), y eventos quincenales en vivo.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;VIP&lt;/strong&gt; suma lo que Premium no incluye: WhatsApp directo conmigo, Cafecitos mensuales en grupo cerrado de 8 founders, LinkedIn Posting Party, Roast My Pitch, y acceso a asesorías grabadas con casos reales.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;El pricing actual lo encuentras en la página de la comunidad —cambia cuando se justifica, así que no lo cierro acá—. Cuando lanzamos un tier nuevo o subimos el pricing, los founders que ya están adentro mantienen el suyo. No buscamos retroactivos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Por qué publico cómo construir una comunidad de founders hispanohablantes
&lt;/h2&gt;

&lt;p&gt;Hoy clarifiqué cómo funciona el sistema —para mí mismo, para los miembros que llevan tiempo y para los que vienen entrando—. Cerramos meses de trabajo aclarando reglas, curando contenido, construyendo el Cofre del Pirata (que pasó de 35 piezas a 69 en dos semanas), y validando el modelo con los miembros activos.&lt;/p&gt;

&lt;p&gt;Ya somos más de 500 founders hispanohablantes operando con IA. Comunidad pequeña, con calidad arriba —o al menos eso intentamos—. La forma de crecer bien para este tipo de proyecto no es por anuncios pagados. Es de boca en boca, como cuando &lt;a href="https://cristiantala.com/como-las-comunidades-y-la-accion-cierran-las-brechas-del-emprendimiento-en-latinoamerica/" rel="noopener noreferrer"&gt;las comunidades cierran brechas del emprendimiento en LATAM&lt;/a&gt;. Founder a founder. Emprendedor a emprendedor.&lt;/p&gt;

&lt;p&gt;Si esto te suma, &lt;a href="https://www.skool.com/cagala-aprende-repite/about" rel="noopener noreferrer"&gt;entrá gratis a CAR acá&lt;/a&gt;. Si conoces a otros founders o emprendedores hispanohablantes que están emprendiendo con IA, mándales el link. Eso me ayuda más que cualquier anuncio.&lt;/p&gt;

&lt;h2&gt;
  
  
  Preguntas frecuentes sobre comunidades para emprendedores con IA
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ¿Qué es Cágala, Aprende, Repite (CAR)?
&lt;/h3&gt;

&lt;p&gt;Es una &lt;strong&gt;comunidad para emprendedores con IA&lt;/strong&gt; hispanohablantes que operan o quieren operar sus empresas apalancando inteligencia artificial. Funciona sobre Skool con un sistema de progresión: entras gratis y desbloqueas cursos aportando a la comunidad (no pagando).&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Cómo funciona el sistema gratuito?
&lt;/h3&gt;

&lt;p&gt;Comentas, posteas o ayudas a otros en el feed. Acumulas puntos. Al subir de nivel se desbloquean los cursos del journey de founder (&lt;a href="https://cristiantala.com/que-es-emprender-la-guia-definitiva-para-dar-tus-primeros-pasos/" rel="noopener noreferrer"&gt;validación de ideas&lt;/a&gt;, pricing, n8n, agentes IA, fundraising, postular a fondos públicos). Sin tarjeta, sin trial trampa, sin paywall escondido.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Hay tiers de pago?
&lt;/h3&gt;

&lt;p&gt;Sí, dos: Premium y VIP. No son para acceder al conocimiento (ese está disponible aportando). Son para acceso inmediato sin esperar niveles, recursos curados (el Cofre del Pirata) y tiempo real conmigo en eventos en vivo. El pricing actual está en la página de la comunidad —puede cambiar, y no quiero estar editando este post cada vez que lo movemos—.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿En qué se diferencia VIP de Premium?
&lt;/h3&gt;

&lt;p&gt;Premium te da acceso completo a cursos + Cofre del Pirata + eventos quincenales. VIP suma tiempo 1:1 y grupal: WhatsApp directo conmigo, Cafecitos mensuales en grupo cerrado de 8 founders, LinkedIn Posting Party, Roast My Pitch, y asesorías grabadas con casos reales. Es para founders que ya están operando y quieren tiempo real con un founder con exit.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Qué pasa si ya soy miembro pago?
&lt;/h3&gt;

&lt;p&gt;Tu pricing original se mantiene. Cuando el pricing público sube, los que ya están adentro siguen con el suyo. No buscamos retroactivos. Si querés mantenerte al día con cómo evoluciona el sistema, podés &lt;a href="https://cristiantala.com/newsletter/" rel="noopener noreferrer"&gt;suscribirte al newsletter Navegando Sin Un Mapa&lt;/a&gt; donde escribo cada lunes sobre cómo opero esto en vivo.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Qué es Skool y para qué sirve?
&lt;/h3&gt;

&lt;p&gt;Skool es una plataforma fundada por Sam Ovens que combina foros, cursos, eventos en vivo y gamification en un solo lugar. Sirve para crear comunidades online monetizables con baja comisión por transacción (2.9% vs 14% Patreon). En español hay comunidades activas como CAR, Emprendedores.com, Líderes Skool y Valida Tu Startup.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Skool, Circle, Teachable o Discord: cuál elegir para una comunidad de emprendedores?
&lt;/h3&gt;

&lt;p&gt;Depende del producto. Si tu modelo es freemium con progresión por niveles y cursos desbloqueables: Skool (gana por simplicidad + efecto red — la gente ya tiene cuenta). Si quieres customización máxima y branding propio: Circle (gran UI pero más fricción de adopción). Si tu producto es el curso individual y no la comunidad: Teachable. Si tu valor principal es chat en vivo permanente: Discord. Hotmart es mejor evitarlo para comunidad — funciona como marketplace de cursos individuales.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Cuánto cobrar por una mentoría sin sentirse impostor?
&lt;/h3&gt;

&lt;p&gt;El framework que uso: no cobres por compartir conocimiento (eso está disponible aportando a la comunidad). Cobra por tu tiempo (sesiones 1:1, eventos en vivo) y por recursos curados (plantillas, workflows, playbooks). Si la mentoría es 1:1 y tu experiencia operacional es real, $100-300/hora es defendible. Si solo tienes teoría, no cobres todavía.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Cómo funciona el modelo freemium para una comunidad online?
&lt;/h3&gt;

&lt;p&gt;El modelo freemium ofrece acceso básico gratuito y reserva funcionalidades avanzadas para usuarios pagos. En una comunidad funciona si: 1) el tier gratuito entrega valor real (no demo), 2) el tier pago compra algo que no escala (tiempo del founder, recursos curados), 3) la conversión es por afinidad cultural, no por paywall agresivo.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Por qué cobrarle a un emprendedor que recién empieza se siente mal?
&lt;/h3&gt;

&lt;p&gt;Porque le estás pidiendo capital escaso a alguien que aún no facturó. La solución no es regalar todo (insostenible), es separar conocimiento (puede ser gratuito y desbloqueable por aporte) de tiempo del founder (cobrable sin culpa). Es el principio Cliefnotes-style: 80% del valor accesible gratis, 20% premium para quienes ya están operando.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Qué diferencia hay entre una comunidad para emprendedores y una comunidad para founders?
&lt;/h3&gt;

&lt;p&gt;En español la línea es difusa: «emprendedor» abarca desde freelancer hasta CEO con ronda Series A. «Founder» suele acotarse a quien fundó una empresa con tracción o ambición de scaleup. Mi comunidad usa «founder hispanohablante» para señalar el perfil: gente que está operando un proyecto propio, no estudiando emprendimiento como hobby.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Se puede emprender en 2026 sin saber de IA?
&lt;/h3&gt;

&lt;p&gt;Sí, pero competirías en desventaja. Emprender en 2026 sin apalancar IA es como hacerlo en 2010 sin internet — no imposible, pero el costo de oportunidad es alto. Un founder con IA puede validar landings en horas, automatizar soporte, producir contenido sin equipo y operar una empresa con un equipo mínimo. Los que no la apalancan terminan compitiendo contra equipos de 10 personas siendo 1.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Cómo elegir entre comunidad gratis o de pago al empezar a emprender?
&lt;/h3&gt;

&lt;p&gt;Si estás validando idea: comunidad gratis con sistema de progresión (Skool, Reddit, Discord). Si ya facturas y quieres profundizar: comunidad de pago con tiempo real del founder + recursos curados. La señal de que es momento de pagar: ya tienes preguntas específicas de operación que no aparecen en buscador, y necesitas alguien con experiencia operacional real (no teoría).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;P.D.&lt;/strong&gt; — Si llegaste hasta acá y esto te resonó: el mejor regalo que me puedes hacer no es comprarme nada. Es compartir esta publicación —o el link a la &lt;a href="https://www.skool.com/cagala-aprende-repite/about" rel="noopener noreferrer"&gt;comunidad&lt;/a&gt;— con algún founder o emprendedor hispanohablante que creas que le puede sumar. Eso es lo que mueve la aguja para un proyecto que no se construye con anuncios.&lt;/p&gt;

&lt;p&gt;— Cristian&lt;/p&gt;

&lt;p&gt;The post &lt;a href="https://cristiantala.com/comunidad-para-emprendedores-con-ia/" rel="noopener noreferrer"&gt;Cómo construí una comunidad de founders sin sentirme un estafador&lt;/a&gt; appeared first on &lt;a href="https://cristiantala.com" rel="noopener noreferrer"&gt;Cristian Tala Sánchez&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Este articulo fue publicado originalmente en &lt;a href="https://cristiantala.com/comunidad-para-emprendedores-con-ia/?utm_source=devto&amp;amp;utm_medium=syndication" rel="noopener noreferrer"&gt;cristiantala.com&lt;/a&gt;. Si te interesa emprendimiento, IA y automatizacion, unite gratis a la comunidad &lt;a href="https://www.skool.com/cagala-aprende-repite?utm_source=devto&amp;amp;utm_medium=syndication" rel="noopener noreferrer"&gt;Cagala, Aprende, Repite&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>devops</category>
      <category>ia</category>
      <category>startup</category>
    </item>
    <item>
      <title>La guerra de IA se terminó. Y sí, alguien ganó — pero eso no es lo importante</title>
      <dc:creator>Cristian Tala</dc:creator>
      <pubDate>Sat, 09 May 2026 15:00:04 +0000</pubDate>
      <link>https://dev.to/cristiantalasanchez/la-guerra-de-ia-se-termino-y-si-alguien-gano-pero-eso-no-es-lo-importante-12mh</link>
      <guid>https://dev.to/cristiantalasanchez/la-guerra-de-ia-se-termino-y-si-alguien-gano-pero-eso-no-es-lo-importante-12mh</guid>
      <description>&lt;p&gt;Hace dos años, si me hubieran dicho que una empresa de 500 personas iba a valer $900 mil millones de dólares, me habría reído.&lt;/p&gt;

&lt;p&gt;No porque sea imposible — en tech hemos visto valuaciones absurdas — sino porque esa empresa estaba &lt;em&gt;detrás&lt;/em&gt; de OpenAI en casi todo: en usuarios, en brand, en ecosistema.&lt;/p&gt;

&lt;p&gt;Hoy, Anthropic está cerrando una ronda a $900B. OpenAI está a $852B. Y lo que pasó en el medio es un caso de estudio en lo que realmente determina quién gana en tecnología cuando la infraestructura se commoditiza.&lt;/p&gt;

&lt;p&gt;No es el que llega primero. No es el que tiene más dinero. Es el que resuelve un problema que el mercado necesita urgentemente — y lo hace mejor que nadie.&lt;/p&gt;

&lt;p&gt;Pero antes de llegar a la conclusión, vamos a lo que realmente importa para ti que estás leyendo esto: &lt;strong&gt;qué diablos significa para tu próxima decisión.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  La historia que nadie cuenta bien
&lt;/h2&gt;

&lt;p&gt;Bloomberg, TechCrunch y The Next Web &lt;a href="https://techcrunch.com/2026/04/29/sources-anthropic-could-raise-a-new-50b-round-at-a-valuation-of-900b/" rel="noopener noreferrer"&gt;reportearon en abril-mayo 2026&lt;/a&gt; que Anthropic está en conversaciones para levantar $40-50 mil millones a una valoración de $850-900 mil millones. Eso representa más del doble de su valoración de febrero 2026, cuando levantó $30 mil millones a $380B.&lt;/p&gt;

&lt;p&gt;La ronda aún no está cerrada. Anthropic no ha commentado. Pero los números de revenue cuentan una historia que hace que esta valuación, aunque parezca loca, tenga sentido.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Anthropic llegó a $30 mil millones de ARR en abril de 2026&lt;/strong&gt;, según &lt;a href="https://thenextweb.com/news/google-40-billion-anthropic-investment-gemini" rel="noopener noreferrer"&gt;Bloomberg via The Next Web&lt;/a&gt;. Eso es crecimiento de $1B en enero 2025 a $30B en 15 meses. &lt;strong&gt;El crecimiento más rápido en la historia de una empresa de tecnología en Estados Unidos.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No es un KPI inventado. Es revenue real de empresas reales pagando licencias empresariales de seis y siete dígitos anuales.&lt;/p&gt;

&lt;h2&gt;
  
  
  El «split»: cuando un mercado se divide en dos y no te avisan
&lt;/h2&gt;

&lt;p&gt;Lo que está pasando ahora tiene nombre: el mercado de modelos de IA para empresas se está dividiendo en dos segmentos claros, y cada segmento tiene un ganador distinto.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Anthropic = coding + B2B workflows.&lt;/strong&gt; &lt;strong&gt;OpenAI = consumer + search.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Los números cuentan la historia mejor que cualquier análisis:&lt;/p&gt;

&lt;p&gt;Fuente: &lt;a href="https://www.kucoin.com/news/flash/anthropic-surpasses-openai-in-revenue-and-market-share" rel="noopener noreferrer"&gt;KuCoin News&lt;/a&gt;, &lt;a href="https://tech-insider.org/anthropic-vs-openai-2026/" rel="noopener noreferrer"&gt;Tech Insider&lt;/a&gt;, &lt;a href="https://michaelparekh.substack.com/p/ai-anthropic-and-openai-dominate" rel="noopener noreferrer"&gt;Michael Parekh/Substack&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Claude Code generó $2.5 mil millones en ARR en solo 9 meses.&lt;/strong&gt; Nueve meses. Eso es más de lo que muchas empresas de software generan en toda su existencia.&lt;/p&gt;

&lt;p&gt;OpenAI, por su parte, tiene más del 80% de su revenue viene de suscripciones de consumidor (ChatGPT), con una tasa de conversión pagada de solo ~5%. Eso no es un modelo de negocio — es una apuesta por el consumidor que todavía no ha demostrado ser sostenible a escala enterprise.&lt;/p&gt;

&lt;p&gt;El CFO de OpenAI, Sarah Friar, &lt;a href="https://www.linkedin.com/posts/ismail-olasunkanmi-4b6283a7_anthropic-is-closing-a-round-at-a-900b-valuation-share-7458076418921631744-8S1A" rel="noopener noreferrer"&gt; reportedly advirtió internamente&lt;/a&gt; que sin aceleración, OpenAI podría tener problemas para financiar sus futuros contratos de compute. Eso es una voz de alarma seria viniendo de alguien que debería estar vendiendo la historia opuesta.&lt;/p&gt;

&lt;h2&gt;
  
  
  La capa de infraestructura tiene 5 jugadores. No puedes ganarle a 5
&lt;/h2&gt;

&lt;p&gt;Aquí es donde la cosa se pone incómoda para quienes piensan que pueden «competir en el layer de modelos.»&lt;/p&gt;

&lt;p&gt;Miremos el mapa actual:&lt;/p&gt;

&lt;p&gt;Cinco jugadores. Todos con acceso a capital prácticamente ilimitado. Todos con contratos de cloud que representan cientos de miles de millones en revenue comprometido. &lt;a href="https://www.aicerts.ai/news/hyperscalers-drive-massive-ai-infrastructure-investment/" rel="noopener noreferrer"&gt;El capex combinado de hyperscalers en 2026 es de ~$650B&lt;/a&gt;, con 70-75% destinado explícitamente a infraestructura de AI.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No puedes ganar ahí.&lt;/strong&gt; No porque no seas bueno — porque el capital requerido para jugar en ese nivel ya no tiene sentido para un startup. Estamos hablando de miles de millones en GPUs, energía, data centers, y talento que puede ir a cualquier lado.&lt;/p&gt;

&lt;p&gt;Esto es lo que pasó con cloud: AWS, Azure y GCP commoditizaron la infraestructura. Lo que vino después fueron Salesforce, HubSpot, Workday. &lt;strong&gt;Aplicaciones sobre infraestructura.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;La misma dinámica se está jugando ahora en AI. La diferencia es que el ciclo es 10x más rápido.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lo que DeepSeek ya te estaba diciendo
&lt;/h2&gt;

&lt;p&gt;Esto no debería ser una sorpresa para nadie que haya estado prestando atención.&lt;/p&gt;

&lt;p&gt;A principios de 2025, DeepSeek demostró algo que muchos ignoraron: puedes tener modelos competitivos sin los cientos de miles de millones que OpenAI y Anthropic están quemando. El inference cost se derrumba. La capacidad de entrenar se distribuye.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pero DeepSeek también mostró otra cosa:&lt;/strong&gt; el infrastructure layer está saturado. Incluso con un modelo competitivo, la batalla por quién controla el acceso a compute y distribución es la que realmente importa.&lt;/p&gt;

&lt;p&gt;Para founders en mercados emergentes — América Latina, África, Sudeste Asiático — el mensaje es claro:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No intentes ser el próximo OpenAI. No intentes ser el próximo Anthropic. Intenta ser el próximo Stripe sobre AWS.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Pago Fácil no compitió con Visa ni con Transbank. Construyó una capa encima que resolvió un problema que los demás no querían resolver: pagos online en Chile cuando nadie creía que era posible. Eso fue en 2011, con un plugin open source que 3,000 empresas usaban gratis antes de que tuviéramos nombre, web, o dashboard.&lt;/p&gt;

&lt;p&gt;Hoy, con la capa de infraestructura de AI sellada por 5 jugadores que se están preparando para IPO, la oportunidad está exactamente en el mismo lugar: &lt;strong&gt;en la capa de aplicación, resolviendo problemas específicos por industria, por geografía, por tipo de usuario.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Qué significa esto para tu stack en 2026
&lt;/h2&gt;

&lt;p&gt;Si eres developer o founder técnico:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Si construyes agentes de código o flujos enterprise&lt;/strong&gt; → Anthropic (Claude) es tu base. 42-54% del mercado de code generation no es运气. Es adopción real por developers que se quedan.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Si vas a consumer apps, search, o asistentes personales&lt;/strong&gt; → OpenAI sigue siendo el default. Brand awareness importa en ese segmento.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Si estás en LATAM, África, o mercados emergentes&lt;/strong&gt; → La oportunidad es profunda, no en modelos, sino en workflows verticales que las empresas globales no van a construir para ti.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Si eres inversor:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;La ronda de Anthropic a $900B con $30B ARR te da un 30x revenue. Eso es caro. Pero si Anthropic llega a $100B ARR en 3 años — plausible dado el momentum enterprise — estás ante un 3-4x desde el precio primario de IPO.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;OpenAI perdiendo $14B en 2026 vs Anthropic siendo cash flow positivo en enterprise no es una comparación justa hoy, pero el mercado va a corregir eso cuando ambos sean públicos.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  El timing importa
&lt;/h2&gt;

&lt;p&gt;Según los reportes, Anthropic espera cerrar la ronda &lt;strong&gt;antes de fin de mayo 2026&lt;/strong&gt;. OpenAI está planeando IPO para octubre 2026.&lt;/p&gt;

&lt;p&gt;Esto significa que estamos en la &lt;strong&gt;última ventana&lt;/strong&gt; para:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Invertir como ángel/VC en rounds primarios&lt;/strong&gt; (si tienes acceso — y si no lo tienes, este es el momento de construir relaciones para el próximo ciclo)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Asegurar partnerships estratégicos&lt;/strong&gt; antes de que sean corporaciones públicas con prioridades de investor relations sobre producto&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Posicionarte en la capa de aplicación&lt;/strong&gt; antes de que los fondos corporativos inunden el espacio con capital barato&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Post-IPO, la dinámica cambia. Los fondos soberanos, los family offices masivos, y el capital institucional van a fluir hacia estos jugadores de forma diferente. La agilidad que existe hoy para builders individuales se va a reducir.&lt;/p&gt;

&lt;h2&gt;
  
  
  La pregunta que nadie hace
&lt;/h2&gt;

&lt;p&gt;Todos están discutiendo si $900B es la valuación correcta para Anthropic. Si $30B ARR justifica $900B de precio. Si OpenAI va a sobrevivir la presión.&lt;/p&gt;

&lt;p&gt;Pero la pregunta más interesante es otra:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿Qué construyes sobre Anthropic y OpenAI que ellos nunca vão a construir?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Porque ellos no van a construir tu vertical. No van a entender tu mercado local. No van a tener tu data.&lt;/p&gt;

&lt;p&gt;Y en technology, la data siempre gana.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fuentes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://techcrunch.com/2026/04/29/sources-anthropic-could-raise-a-new-50b-round-at-a-valuation-of-900b/" rel="noopener noreferrer"&gt;TechCrunch: Anthropic $50B round at $900B valuation (Abr 2026)&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://thenextweb.com/news/google-40-billion-anthropic-investment-gemini" rel="noopener noreferrer"&gt;The Next Web: Google $40B Anthropic investment (May 2026)&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.kucoin.com/news/flash/anthropic-surpasses-openai-in-revenue-and-market-share" rel="noopener noreferrer"&gt;KuCoin News: Anthropic surpasses OpenAI in revenue and market share&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://tech-insider.org/anthropic-vs-openai-2026/" rel="noopener noreferrer"&gt;Tech Insider: Anthropic vs OpenAI 2026&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://michaelparekh.substack.com/p/ai-anthropic-and-openai-dominate" rel="noopener noreferrer"&gt;Michael Parekh/Substack: AI Anthropic and OpenAI dominate&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.aicerts.ai/news/hyperscalers-drive-massive-ai-infrastructure-investment/" rel="noopener noreferrer"&gt;AI Certs: Hyperscalers AI infrastructure investment 2026&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://tspasemiconductor.substack.com/p/the-2026-ai-ipo-wave-from-models" rel="noopener noreferrer"&gt;TSP Semiconductor: The 2026 AI IPO wave&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.linkedin.com/posts/ismail-olasunkanmi-4b6283a7_anthropic-is-closing-a-round-at-a-900b-valuation-share-7458076418921631744-8S1A" rel="noopener noreferrer"&gt;LinkedIn: Ismail Olasunkanmi post&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;¿Tienes dudas sobre cómo posicionarte en la capa de aplicación de AI? *&lt;/em&gt;Únete a mi comunidad de emprendedores en &lt;a href="https://www.skool.com/cagala-aprende-repite/about" rel="noopener noreferrer"&gt;Cágala, Aprende, Repite&lt;/a&gt;** — ahí podemos ayudarte entre todos a pensar estas decisiones.*&lt;/p&gt;

&lt;p&gt;The post &lt;a href="https://cristiantala.com/la-guerra-de-ia-se-termino-y-si-alguien-gano-pero-eso-no-es-lo-importante/" rel="noopener noreferrer"&gt;La guerra de IA se terminó. Y sí, alguien ganó — pero eso no es lo importante&lt;/a&gt; appeared first on &lt;a href="https://cristiantala.com" rel="noopener noreferrer"&gt;Cristian Tala Sánchez&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Este articulo fue publicado originalmente en &lt;a href="https://cristiantala.com/la-guerra-de-ia-se-termino-y-si-alguien-gano-pero-eso-no-es-lo-importante/?utm_source=devto&amp;amp;utm_medium=syndication" rel="noopener noreferrer"&gt;cristiantala.com&lt;/a&gt;. Si te interesa emprendimiento, IA y automatizacion, unite gratis a la comunidad &lt;a href="https://www.skool.com/cagala-aprende-repite?utm_source=devto&amp;amp;utm_medium=syndication" rel="noopener noreferrer"&gt;Cagala, Aprende, Repite&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ia</category>
    </item>
  </channel>
</rss>
