<?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: JEONSEWON</title>
    <description>The latest articles on DEV Community by JEONSEWON (@jeonsewon).</description>
    <link>https://dev.to/jeonsewon</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3781888%2Fe7d6377e-9f5c-4964-8938-bf0a1317f26e.jpg</url>
      <title>DEV Community: JEONSEWON</title>
      <link>https://dev.to/jeonsewon</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jeonsewon"/>
    <language>en</language>
    <item>
      <title>I built an open-source API monitor that catches silent failures — HTTP 200 doesn't mean your API is healthy</title>
      <dc:creator>JEONSEWON</dc:creator>
      <pubDate>Thu, 02 Apr 2026 17:20:23 +0000</pubDate>
      <link>https://dev.to/jeonsewon/i-built-an-open-source-api-monitor-that-catches-silent-failures-http-200-doesnt-mean-your-api-is-33n1</link>
      <guid>https://dev.to/jeonsewon/i-built-an-open-source-api-monitor-that-catches-silent-failures-http-200-doesnt-mean-your-api-is-33n1</guid>
      <description>&lt;h2&gt;
  
  
  The problem with standard API monitoring
&lt;/h2&gt;

&lt;p&gt;Most monitoring tools work like this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Send a request to your endpoint&lt;/li&gt;
&lt;li&gt;Check the HTTP status code&lt;/li&gt;
&lt;li&gt;If 200 → ✅ healthy. If 5xx → ❌ alert.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This misses an entire category of failures.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is a silent failure?
&lt;/h2&gt;

&lt;p&gt;Your API returns &lt;code&gt;200 OK&lt;/code&gt; — but something is actually wrong:&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;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;HTTP&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;but...&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;"error"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"database_connection_failed"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"data"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&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;Or worse — an empty response body. Or a completely different payload than expected.&lt;/p&gt;

&lt;p&gt;Standard monitors report this as healthy. Your users experience a broken product.&lt;/p&gt;

&lt;h2&gt;
  
  
  How CheckAPI handles this
&lt;/h2&gt;

&lt;p&gt;Three levels of response body validation:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Keyword validation&lt;/strong&gt;&lt;br&gt;
Specify a keyword that must be present or absent in the response body.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Present: &lt;code&gt;"status":"ok"&lt;/code&gt; must exist → fails if missing&lt;/li&gt;
&lt;li&gt;Absent: &lt;code&gt;"error"&lt;/code&gt; must not exist → fails if found&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;2. Regex support&lt;/strong&gt;&lt;br&gt;
Match patterns for structured validation:&lt;br&gt;
/"user_id":\d+/&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. JSON Path (coming soon)&lt;/strong&gt;&lt;br&gt;
Target nested fields directly without parsing the full response.&lt;/p&gt;

&lt;h2&gt;
  
  
  The rest of the feature set
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;HTTP methods: GET, POST, PUT, DELETE, PATCH, HEAD, OPTIONS&lt;/li&gt;
&lt;li&gt;Custom headers + request body&lt;/li&gt;
&lt;li&gt;5 alert channels: Email, Slack, Telegram, Discord, Custom Webhook&lt;/li&gt;
&lt;li&gt;SSL certificate expiry alerts (14 days before)&lt;/li&gt;
&lt;li&gt;Public status pages&lt;/li&gt;
&lt;li&gt;Response time tracking + uptime % (24h / 7d / 30d)&lt;/li&gt;
&lt;li&gt;Check intervals: 5min (free) → 1min → 30sec → 10sec&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Tech stack
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Backend:&lt;/strong&gt; FastAPI + Celery + Redis + PostgreSQL → Railway&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Frontend:&lt;/strong&gt; Next.js 14 + TypeScript + Tailwind CSS → Vercel&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Payments:&lt;/strong&gt; LemonSqueezy&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Email:&lt;/strong&gt; Resend  &lt;/p&gt;

&lt;h2&gt;
  
  
  Pricing
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Plan&lt;/th&gt;
&lt;th&gt;Price&lt;/th&gt;
&lt;th&gt;Monitors&lt;/th&gt;
&lt;th&gt;Interval&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;td&gt;$0&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;5 min&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Starter&lt;/td&gt;
&lt;td&gt;$5/mo&lt;/td&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;td&gt;1 min&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pro&lt;/td&gt;
&lt;td&gt;$15/mo&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;30 sec&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Business&lt;/td&gt;
&lt;td&gt;$49/mo&lt;/td&gt;
&lt;td&gt;Unlimited&lt;/td&gt;
&lt;td&gt;10 sec&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Free plan has &lt;strong&gt;no commercial restrictions&lt;/strong&gt; — unlike UptimeRobot which restricted &lt;br&gt;
commercial use on free plans in December 2024.&lt;/p&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;🌐 Live: &lt;a href="https://checkapi.io" rel="noopener noreferrer"&gt;checkapi.io&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;💻 GitHub (MIT): &lt;a href="https://github.com/JEONSEWON/CheckAPI" rel="noopener noreferrer"&gt;JEONSEWON/CheckAPI&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Built by a solo dev from Seoul 🇰🇷. Happy to answer questions about the architecture &lt;br&gt;
or the silent failure detection approach.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>webdev</category>
      <category>devops</category>
      <category>showdev</category>
    </item>
    <item>
      <title>I built an API monitoring tool because every existing one either costs too much or restricts commercial use</title>
      <dc:creator>JEONSEWON</dc:creator>
      <pubDate>Sat, 07 Mar 2026 05:37:44 +0000</pubDate>
      <link>https://dev.to/jeonsewon/i-built-an-api-monitoring-tool-because-every-existing-one-either-costs-too-much-or-restricts-406a</link>
      <guid>https://dev.to/jeonsewon/i-built-an-api-monitoring-tool-because-every-existing-one-either-costs-too-much-or-restricts-406a</guid>
      <description>&lt;h2&gt;
  
  
  The problem
&lt;/h2&gt;

&lt;p&gt;I was building a side project and needed to monitor a few API endpoints.&lt;/p&gt;

&lt;p&gt;I tried the usual suspects:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;UptimeRobot free&lt;/strong&gt;: 50 monitors, sounds great — until you read "non-commercial use only"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Better Uptime&lt;/strong&gt;: $20/mo minimum for anything useful&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pingdom&lt;/strong&gt;: No free tier at all&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Datadog&lt;/strong&gt;: Powerful, but $100+/mo overkill&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All of them also share another problem: &lt;strong&gt;they only check status codes&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Your API can return &lt;code&gt;200 OK&lt;/code&gt; with a body of &lt;code&gt;{"error": "database connection failed"}&lt;/code&gt; and most uptime tools will happily mark it as "up."&lt;/p&gt;

&lt;h2&gt;
  
  
  What I built
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;CheckAPI&lt;/strong&gt; (&lt;a href="https://checkapi.io" rel="noopener noreferrer"&gt;https://checkapi.io&lt;/a&gt;) — API health monitoring with a focus on what actually matters to developers.&lt;/p&gt;

&lt;h3&gt;
  
  
  Key features
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;1. Response body keyword validation&lt;/strong&gt;&lt;br&gt;
Set a keyword that must be present (or absent) in the response body. &lt;br&gt;
Example: check that &lt;code&gt;"status":"ok"&lt;/code&gt; exists in the response — not just that the server responded.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. SSL certificate expiry alerts&lt;/strong&gt;&lt;br&gt;
Get notified 14 days before your cert expires. Especially useful if you're using Let's Encrypt's 90-day certificates.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Free tier with no commercial restrictions&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;10 monitors&lt;/li&gt;
&lt;li&gt;5-minute check intervals&lt;/li&gt;
&lt;li&gt;All 5 alert channels (Email, Slack, Telegram, Discord, Webhook)&lt;/li&gt;
&lt;li&gt;No "non-commercial use only" restriction&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;4. Paid plans from $5/mo&lt;/strong&gt;&lt;br&gt;
Starter ($5): 20 monitors, 1-minute checks, 30-day history&lt;br&gt;&lt;br&gt;
Pro ($15): 100 monitors, 30-second checks, team sharing&lt;br&gt;&lt;br&gt;
Business ($49): Unlimited monitors, 10-second checks, 1-year history&lt;/p&gt;

&lt;h2&gt;
  
  
  Tech stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Backend&lt;/strong&gt;: FastAPI + Celery + Redis + PostgreSQL (Railway)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Frontend&lt;/strong&gt;: Next.js 14 + TypeScript + Tailwind CSS (Vercel)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Alerts&lt;/strong&gt;: Resend (email), direct API calls for Slack/Telegram/Discord/Webhook&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Current status
&lt;/h2&gt;

&lt;p&gt;Just launched. $0 MRR. Building in public at &lt;a href="https://x.com/imwon_dev" rel="noopener noreferrer"&gt;@imwon_dev&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Would love feedback — especially if you've hit the "non-commercial use" wall with other tools, or if keyword validation would have caught a bug for you.&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://checkapi.io" rel="noopener noreferrer"&gt;https://checkapi.io&lt;/a&gt; — free forever tier, no credit card required&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>saas</category>
      <category>webdev</category>
      <category>ai</category>
    </item>
    <item>
      <title>Building CheckAPI: From Idea to Production in 6 Weeks with FastAPI and Next.js</title>
      <dc:creator>JEONSEWON</dc:creator>
      <pubDate>Sat, 21 Feb 2026 11:50:52 +0000</pubDate>
      <link>https://dev.to/jeonsewon/building-checkapi-from-idea-to-production-in-6-weeks-with-fastapi-and-nextjs-1b8h</link>
      <guid>https://dev.to/jeonsewon/building-checkapi-from-idea-to-production-in-6-weeks-with-fastapi-and-nextjs-1b8h</guid>
      <description>&lt;p&gt;I just launched CheckAPI - an open source API monitoring tool built in 6 weeks. Here's how I did it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;Existing monitoring tools are either too expensive ($75-100/mo) or have outdated UIs. I wanted something affordable for side projects with modern tech.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tech Stack
&lt;/h2&gt;

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

&lt;ul&gt;
&lt;li&gt;FastAPI (Python)&lt;/li&gt;
&lt;li&gt;Celery + Beat for background workers&lt;/li&gt;
&lt;li&gt;Redis as message broker&lt;/li&gt;
&lt;li&gt;SQLAlchemy ORM&lt;/li&gt;
&lt;li&gt;PostgreSQL&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;Next.js 14 (App Router)&lt;/li&gt;
&lt;li&gt;TypeScript&lt;/li&gt;
&lt;li&gt;Tailwind CSS&lt;/li&gt;
&lt;li&gt;Zustand for state&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;Railway (backend + worker)&lt;/li&gt;
&lt;li&gt;Vercel (frontend)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Key Features
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Real-time health checks (30s - 5min intervals)&lt;/li&gt;
&lt;li&gt;Multi-channel alerts (Email, Slack, Telegram, Discord, Webhooks)&lt;/li&gt;
&lt;li&gt;Response time tracking&lt;/li&gt;
&lt;li&gt;Public status pages&lt;/li&gt;
&lt;li&gt;Payment integration (LemonSqueezy)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Technical Challenges
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Celery + Beat in One Process
&lt;/h3&gt;

&lt;p&gt;Railway needed combined worker+scheduler:&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
python
celery -A app.celery_app worker --beat --concurrency=2

2. Multi-Channel Alerts

Created abstraction in alerts.py for 5 different APIs.

3. Token Refresh

Axios interceptor handles JWT expiry smoothly.

Results

• 34 API endpoints
• 5 alert channels
• Full payment system
• Open source (MIT)

Live Demo
![ ](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ow88ql588cpko5rs7jub.png)

• Website: [https://checkapi.io](https://checkapi.io )
• GitHub: [https://github.com/JEONSEWON/api-health-monitor]
Built with AI assistance (OpenClaw) which sped up development significantly.

Questions? Ask in comments!

#buildinpublic #indiehacker
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>webdev</category>
      <category>python</category>
      <category>nextjs</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
