<?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: Griffin Krum</title>
    <description>The latest articles on DEV Community by Griffin Krum (@jdintelligence).</description>
    <link>https://dev.to/jdintelligence</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%2F3961828%2Ff48537bb-c6f1-47e1-8daa-15de5018a641.png</url>
      <title>DEV Community: Griffin Krum</title>
      <link>https://dev.to/jdintelligence</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jdintelligence"/>
    <language>en</language>
    <item>
      <title>I built a $29/mo job description parsing API — the self-serve Affinda alternative</title>
      <dc:creator>Griffin Krum</dc:creator>
      <pubDate>Mon, 01 Jun 2026 02:07:21 +0000</pubDate>
      <link>https://dev.to/jdintelligence/i-built-a-29mo-job-description-parsing-api-the-self-serve-affinda-alternative-1g5f</link>
      <guid>https://dev.to/jdintelligence/i-built-a-29mo-job-description-parsing-api-the-self-serve-affinda-alternative-1g5f</guid>
      <description>&lt;p&gt;I run into the same conversation every time I talk to someone building a job board or ATS tool:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"How do you handle job description parsing?"&lt;br&gt;
"...we just have employers fill in a form manually."&lt;br&gt;
"And if they paste a raw JD?"&lt;br&gt;
"We kind of... hope for the best."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That's the gap. Affinda parses JDs well, but their entry plan starts around $800/month with a sales call requirement. There's no self-serve option, no free trial you can actually test with real data, and no pricing that makes sense for an indie job board doing 200 postings a month.&lt;/p&gt;

&lt;p&gt;So I built &lt;a href="https://jdintelligence.dev" rel="noopener noreferrer"&gt;JD Intelligence&lt;/a&gt; — a self-serve JD parsing API at $29/mo with a 7-day free trial and no sales call.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it does
&lt;/h2&gt;

&lt;p&gt;Four endpoints:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;POST /parse&lt;/code&gt;&lt;/strong&gt; — Takes raw job description text, returns 16 structured fields:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Job title (normalised)&lt;/li&gt;
&lt;li&gt;Salary min/max + currency&lt;/li&gt;
&lt;li&gt;Required skills (array)&lt;/li&gt;
&lt;li&gt;Nice-to-have skills (array)&lt;/li&gt;
&lt;li&gt;Seniority level&lt;/li&gt;
&lt;li&gt;Employment type&lt;/li&gt;
&lt;li&gt;Remote policy&lt;/li&gt;
&lt;li&gt;Location&lt;/li&gt;
&lt;li&gt;Visa sponsorship&lt;/li&gt;
&lt;li&gt;Education requirements&lt;/li&gt;
&lt;li&gt;Years of experience&lt;/li&gt;
&lt;li&gt;Industry&lt;/li&gt;
&lt;li&gt;Department&lt;/li&gt;
&lt;li&gt;Benefits&lt;/li&gt;
&lt;li&gt;Application deadline&lt;/li&gt;
&lt;li&gt;Language requirements&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;POST /score&lt;/code&gt;&lt;/strong&gt; — Takes a resume + job description, returns an ATS compatibility score with field-by-field breakdown. Useful for job matching, resume screening, candidate ranking.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;POST /enrich&lt;/code&gt;&lt;/strong&gt; — Rewrites a JD for clarity, inclusive language, and better structure. Removes jargon, separates must-haves from nice-to-haves, standardises formatting. Returns the rewritten JD plus a diff of changes made.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;POST /classify&lt;/code&gt;&lt;/strong&gt; — Tags a JD with department, function, industry, and seniority. One call, clean JSON. Useful for job board taxonomy and SEO page generation.&lt;/p&gt;

&lt;h2&gt;
  
  
  The tech stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;FastAPI&lt;/strong&gt; for the API layer — fast, clean, automatic OpenAPI docs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Claude API&lt;/strong&gt; for the actual parsing/enrichment/classification — far more reliable than regex or fine-tuned models for understanding messy real-world JD text&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Redis&lt;/strong&gt; for response caching — same JD hit twice doesn't cost twice&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Railway&lt;/strong&gt; for hosting — zero-config deploys, easy environment management&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stripe&lt;/strong&gt; for billing — metered usage + subscription tiers&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why Claude for parsing?
&lt;/h2&gt;

&lt;p&gt;I tried a few approaches before landing on this. Rule-based extraction with spaCy works fine for structured JDs but falls apart on the noisy ones — missing salary ranges buried in paragraphs, skills listed as "experience with the Adobe suite" instead of named tools, seniority implied by responsibilities rather than stated directly.&lt;/p&gt;

&lt;p&gt;Claude handles that ambiguity well. A JD that says "you'll be leading a small team of engineers and reporting to the CTO" correctly gets classified as senior/lead level. A JD that says "competitive compensation" with a Glassdoor link in the footer gets flagged as salary-not-disclosed rather than hallucinating a number.&lt;/p&gt;

&lt;p&gt;The tradeoff is cost and latency. Each /parse call takes 1-3 seconds and costs a few cents in Claude API usage. That's fine for job board use cases (you're parsing when a JD is submitted, not on every page load), but it's something to be aware of.&lt;/p&gt;

&lt;h2&gt;
  
  
  The caching layer
&lt;/h2&gt;

&lt;p&gt;Redis caching on a hash of the JD text means if the same JD gets submitted twice — which happens constantly with job boards syndicating listings — the second call is instant and free. Cache TTL is 24 hours. This cuts real-world API costs significantly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Current state
&lt;/h2&gt;

&lt;p&gt;Launched this week. $29/mo for 200 parses, 7-day free trial, instant API key.&lt;/p&gt;

&lt;p&gt;Live demo with no signup at &lt;a href="https://jdintelligence.dev/demo" rel="noopener noreferrer"&gt;jdintelligence.dev/demo&lt;/a&gt; — paste any real job description and see the JSON output.&lt;/p&gt;

&lt;p&gt;Docs at &lt;a href="https://jdintelligence.dev/docs" rel="noopener noreferrer"&gt;jdintelligence.dev/docs&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I'm looking for
&lt;/h2&gt;

&lt;p&gt;Feedback from anyone building in this space — job boards, ATS tools, recruiting agents, resume matching tools. Is /score useful or does the matching need to be more configurable? Is 200 parses/mo the right entry tier?&lt;/p&gt;

&lt;p&gt;If you're building something where structured JD data would help, I'd love to talk through the use case.&lt;/p&gt;

</description>
      <category>api</category>
      <category>showdev</category>
      <category>python</category>
      <category>buildinpublic</category>
    </item>
  </channel>
</rss>
