<?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: juhwandad</title>
    <description>The latest articles on DEV Community by juhwandad (@juhwandad74).</description>
    <link>https://dev.to/juhwandad74</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%2F4013482%2F19a23e91-984c-4c64-8155-32f740635990.png</url>
      <title>DEV Community: juhwandad</title>
      <link>https://dev.to/juhwandad74</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/juhwandad74"/>
    <language>en</language>
    <item>
      <title>How to Get Clean SEC EDGAR Filing Data (Without Getting Rate-Limited)</title>
      <dc:creator>juhwandad</dc:creator>
      <pubDate>Fri, 03 Jul 2026 10:59:12 +0000</pubDate>
      <link>https://dev.to/juhwandad74/how-to-get-clean-sec-edgar-filing-data-without-getting-rate-limited-o89</link>
      <guid>https://dev.to/juhwandad74/how-to-get-clean-sec-edgar-filing-data-without-getting-rate-limited-o89</guid>
      <description>&lt;p&gt;If you've ever tried to pull U.S. company filings straight from SEC EDGAR, you know the pain. The data is free and public — but using it in a real app is a different story.&lt;/p&gt;

&lt;p&gt;Here's the problem, and a shortcut I built to get around it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem with raw EDGAR
&lt;/h2&gt;

&lt;p&gt;SEC's official API at &lt;code&gt;data.sec.gov&lt;/code&gt; is great until you actually depend on it:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Rate limits.&lt;/strong&gt; You're capped at 10 requests/second, and if you cross it your IP is blocked for ~10 minutes. That's fine for a script, brutal for a production feature.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Inconsistent shape.&lt;/strong&gt; Every form type and endpoint returns a slightly different JSON structure. Parsing becomes a maintenance tax.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Missing metadata.&lt;/strong&gt; You get a CIK and a raw SIC code — but no sector, no industry, no exchange, and no idea what an 8-K "item 2.02" actually means.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;So you end up writing a crawler, a cache, a rate-limiter, a SIC→sector map, and an 8-K item lookup table… just to answer "what did Apple just file?"&lt;/p&gt;

&lt;h2&gt;
  
  
  The shortcut
&lt;/h2&gt;

&lt;p&gt;I got tired of rebuilding that every project, so I packaged it into a small API that &lt;strong&gt;crawls, caches, and enriches&lt;/strong&gt; EDGAR for you. It's served entirely from a cache (refreshed every 6 hours), so &lt;strong&gt;you never hit SEC's rate limits&lt;/strong&gt;, and every response uses one consistent schema.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;GET /companies/{ticker}&lt;/code&gt; — enriched company: CIK, exchange, &lt;strong&gt;sector, industry&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;GET /companies/{ticker}/filings&lt;/code&gt; — a company's filings, filter by form (&lt;code&gt;8-K&lt;/code&gt;, &lt;code&gt;10-K&lt;/code&gt;, &lt;code&gt;10-Q&lt;/code&gt;…)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;GET /filings/latest&lt;/code&gt; — latest 8-K feed, filter by &lt;strong&gt;sector&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;GET /funds/{cik}/13f/latest&lt;/code&gt; — parsed 13F institutional holdings&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Quick example
&lt;/h2&gt;

&lt;p&gt;Grab a free key from the &lt;a href="https://rapidapi.com/jang1red/api/sec-edgar-data-api" rel="noopener noreferrer"&gt;listing page&lt;/a&gt;, then:&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="s2"&gt;"https://sec-edgar-data-api1.p.rapidapi.com/companies/AAPL"&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;"X-RapidAPI-Key: YOUR_KEY"&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;"X-RapidAPI-Host: sec-edgar-data-api1.p.rapidapi.com"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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;"cik"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0000320193"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"ticker"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"AAPL"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Apple Inc."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"exchange"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Nasdaq"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"sic"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"3571"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"sic_description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Electronic Computers"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"sector"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Information Technology"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"industry"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Industrial Machinery &amp;amp; Computer Equipment"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"fiscal_year_end"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0926"&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;Note the &lt;code&gt;sector&lt;/code&gt; and &lt;code&gt;industry&lt;/code&gt; fields — SEC doesn't give you those. They're derived from the SIC code so you can filter and group companies without maintaining your own mapping.&lt;/p&gt;

&lt;p&gt;In Python:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;

&lt;span class="n"&gt;BASE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://sec-edgar-data-api1.p.rapidapi.com&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;HEADERS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;X-RapidAPI-Key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;X-RapidAPI-Host&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sec-edgar-data-api1.p.rapidapi.com&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;# Latest 8-K filings in Health Care, with plain-English item labels
&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;BASE&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/filings/latest&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                 &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;HEADERS&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                 &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;form&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;8-K&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sector&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Health Care&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;limit&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;filings&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ticker&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;filing_date&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;item_descriptions&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;LLY  2026-04-30  ['Results of Operations and Financial Condition', 'Financial Statements and Exhibits']
MRK  2026-04-29  ['Other Events', 'Financial Statements and Exhibits']
...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That &lt;code&gt;item_descriptions&lt;/code&gt; field is the other bit of enrichment — instead of decoding &lt;code&gt;2.02&lt;/code&gt; and &lt;code&gt;9.01&lt;/code&gt; yourself, you get what the 8-K actually reports.&lt;/p&gt;

&lt;h2&gt;
  
  
  Institutional holdings (13F)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="s2"&gt;"https://sec-edgar-data-api1.p.rapidapi.com/funds/1067983/13f/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;"X-RapidAPI-Key: YOUR_KEY"&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;"X-RapidAPI-Host: sec-edgar-data-api1.p.rapidapi.com"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Returns Berkshire Hathaway's latest 13F with holdings parsed out of the information table — issuer, CUSIP, value, and share count — so you don't have to fetch and parse the XML yourself.&lt;/p&gt;

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

&lt;p&gt;There's a &lt;strong&gt;free tier (500 calls/month)&lt;/strong&gt; to try it, then paid tiers for higher volume. Billing runs through RapidAPI, so you just need a RapidAPI key.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fair warning
&lt;/h2&gt;

&lt;p&gt;This is an independent project and is &lt;strong&gt;not affiliated with or endorsed by the U.S. SEC&lt;/strong&gt;. The data comes from public EDGAR filings, and nothing here is financial advice — always verify against the primary source for anything that matters.&lt;/p&gt;




&lt;p&gt;I built this to scratch my own itch, and I'd genuinely like it to be useful to others building screeners, alerts, or research tools. &lt;strong&gt;What filing types or fields would make this actually fit your workflow?&lt;/strong&gt; Let me know in the comments — I'm actively adding to it.&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://rapidapi.com/jang1red/api/sec-edgar-data-api" rel="noopener noreferrer"&gt;SEC EDGAR Data API on RapidAPI&lt;/a&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>api</category>
      <category>finance</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
