<?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: Suvankar Mitra</title>
    <description>The latest articles on DEV Community by Suvankar Mitra (@suvankar_mitra_f543fbc44d).</description>
    <link>https://dev.to/suvankar_mitra_f543fbc44d</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%2F4243994%2Fd4037b6c-510d-4984-92fc-997d9b52b3ba.png</url>
      <title>DEV Community: Suvankar Mitra</title>
      <link>https://dev.to/suvankar_mitra_f543fbc44d</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/suvankar_mitra_f543fbc44d"/>
    <language>en</language>
    <item>
      <title>I Built a Free English Dictionary API Using Wiktionary Data extract</title>
      <dc:creator>Suvankar Mitra</dc:creator>
      <pubDate>Sat, 14 Nov 2026 06:40:30 +0000</pubDate>
      <link>https://dev.to/suvankar_mitra_f543fbc44d/i-built-a-free-english-dictionary-api-using-wiktionary-data-extract-26j5</link>
      <guid>https://dev.to/suvankar_mitra_f543fbc44d/i-built-a-free-english-dictionary-api-using-wiktionary-data-extract-26j5</guid>
      <description>&lt;p&gt;I wanted to build something useful for developers: a free English dictionary API that anyone could integrate into their applications without worrying about API keys, registration, or complicated onboarding.&lt;/p&gt;

&lt;p&gt;That idea eventually turned into my &lt;strong&gt;Free Dictionary API&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;🔗 &lt;strong&gt;Try it:&lt;/strong&gt; &lt;a href="https://api.suvankar.cc/docs/dictionary" rel="noopener noreferrer"&gt;https://api.suvankar.cc/docs/dictionary&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In this article, I'll share what I built, where the dictionary data comes from, the technology behind it, and some of the engineering challenges I encountered along the way.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why build another dictionary API?
&lt;/h2&gt;

&lt;p&gt;There are already several dictionary APIs available. However, I wanted to build something that was:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Free to use.&lt;/li&gt;
&lt;li&gt;Accessible without an API key.&lt;/li&gt;
&lt;li&gt;Easy to integrate into applications.&lt;/li&gt;
&lt;li&gt;Based on a comprehensive, openly available dictionary dataset.&lt;/li&gt;
&lt;li&gt;Simple enough for developers to experiment with.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I also wanted to learn more about processing large dictionary datasets and building a public-facing API that could serve real-world applications.&lt;/p&gt;

&lt;p&gt;Rather than starting with manually curated dictionary entries, I decided to explore Wiktionary.&lt;/p&gt;

&lt;h2&gt;
  
  
  The data: Wiktionary
&lt;/h2&gt;

&lt;p&gt;The foundation of this project is data derived from &lt;a href="https://www.wiktionary.org/" rel="noopener noreferrer"&gt;Wiktionary&lt;/a&gt;, the collaborative, multilingual dictionary project.&lt;/p&gt;

&lt;p&gt;I used structured Wiktionary data available through &lt;a href="https://kaikki.org/" rel="noopener noreferrer"&gt;Kaikki.org&lt;/a&gt;, which makes Wiktionary content available in machine-readable formats.&lt;/p&gt;

&lt;p&gt;This was particularly interesting because dictionary entries contain much more than just a word and its definition.&lt;/p&gt;

&lt;p&gt;An entry can include information such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Definitions and senses.&lt;/li&gt;
&lt;li&gt;Parts of speech.&lt;/li&gt;
&lt;li&gt;Pronunciations.&lt;/li&gt;
&lt;li&gt;Etymology.&lt;/li&gt;
&lt;li&gt;Examples of usage.&lt;/li&gt;
&lt;li&gt;Translations.&lt;/li&gt;
&lt;li&gt;Grammatical information.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Processing this information into a structure that could be efficiently queried through a REST API was one of the interesting parts of the project.&lt;/p&gt;

&lt;h2&gt;
  
  
  Designing the database
&lt;/h2&gt;

&lt;p&gt;One of the first challenges was deciding how to represent dictionary data in a relational database.&lt;/p&gt;

&lt;p&gt;A dictionary entry isn't necessarily a simple one-to-one relationship between a word and a definition.&lt;/p&gt;

&lt;p&gt;A single word can have multiple meanings, different parts of speech, examples, translations, and additional metadata.&lt;/p&gt;

&lt;p&gt;I use PostgreSQL as the primary database and a relational structure to represent these relationships.&lt;/p&gt;

&lt;p&gt;The objective was to keep the data structured while making common dictionary lookups efficient.&lt;/p&gt;

&lt;p&gt;The data ingestion and processing pipeline is maintained separately from the API repository. The repository linked below contains the API application itself.&lt;/p&gt;

&lt;h2&gt;
  
  
  Building the API
&lt;/h2&gt;

&lt;p&gt;I used Java 21 and Spring Boot 3 to build the REST API.&lt;/p&gt;

&lt;p&gt;The API exposes dictionary information through straightforward HTTP endpoints that return structured JSON responses.&lt;/p&gt;

&lt;p&gt;Some of its current capabilities include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Looking up English word definitions.&lt;/li&gt;
&lt;li&gt;Searching for words by prefix.&lt;/li&gt;
&lt;li&gt;Retrieving translations.&lt;/li&gt;
&lt;li&gt;Accessing Word of the Day.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For example, retrieving a definition is as simple as:&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://api.suvankar.cc/dictionaryapi/v1/definitions/en/happy?compact=true"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can also search for words:&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://api.suvankar.cc/dictionaryapi/v1/words/en/?filter=happ&amp;amp;page=0&amp;amp;size=5"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And retrieve translations:&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://api.suvankar.cc/dictionaryapi/v1/translations/en/?word=secure&amp;amp;pos=verb"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The API returns JSON that can be consumed by web applications, mobile applications, scripts, or other backend services.&lt;/p&gt;

&lt;p&gt;You can explore the available endpoints and response structures in the interactive documentation:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://api.suvankar.cc/docs/dictionary" rel="noopener noreferrer"&gt;https://api.suvankar.cc/docs/dictionary&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Some engineering decisions
&lt;/h2&gt;

&lt;p&gt;Building the endpoints was only one part of the project. Making them efficient and suitable for public consumption required additional infrastructure.&lt;/p&gt;

&lt;p&gt;Here's a look at some of the technologies involved.&lt;/p&gt;

&lt;h3&gt;
  
  
  PostgreSQL
&lt;/h3&gt;

&lt;p&gt;PostgreSQL stores the structured dictionary data.&lt;/p&gt;

&lt;p&gt;Given the relationships between words, senses, definitions, examples, and translations, a relational database was a natural choice.&lt;/p&gt;

&lt;h3&gt;
  
  
  Redis
&lt;/h3&gt;

&lt;p&gt;I introduced Redis caching to avoid repeatedly querying PostgreSQL for frequently requested dictionary entries.&lt;/p&gt;

&lt;p&gt;Dictionary lookups are particularly suitable for caching because the underlying data doesn't change with every request.&lt;/p&gt;

&lt;h3&gt;
  
  
  Rate limiting
&lt;/h3&gt;

&lt;p&gt;Since the API is publicly accessible without API keys, I also needed a way to protect the service from excessive request volumes.&lt;/p&gt;

&lt;p&gt;I implemented rate limiting using Bucket4j.&lt;/p&gt;

&lt;p&gt;The idea is to keep the service accessible while protecting the underlying infrastructure from excessive traffic.&lt;/p&gt;

&lt;h3&gt;
  
  
  Docker
&lt;/h3&gt;

&lt;p&gt;The application is containerised using Docker, making deployment and environment management easier.&lt;/p&gt;

&lt;h2&gt;
  
  
  Making it accessible without API keys
&lt;/h2&gt;

&lt;p&gt;One decision I deliberately made was not to require API keys.&lt;/p&gt;

&lt;p&gt;I wanted developers to be able to open the documentation, make their first request, and get a response immediately.&lt;/p&gt;

&lt;p&gt;No registration forms, no API key generation, and no complicated setup.&lt;/p&gt;

&lt;p&gt;Of course, public access doesn't mean unlimited resources. The API has rate limits to help maintain service availability.&lt;/p&gt;

&lt;h2&gt;
  
  
  What can you build with it?
&lt;/h2&gt;

&lt;p&gt;There are plenty of possible applications for a dictionary API.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;English dictionary applications.&lt;/li&gt;
&lt;li&gt;Vocabulary learning tools.&lt;/li&gt;
&lt;li&gt;Word-of-the-day applications.&lt;/li&gt;
&lt;li&gt;Language learning platforms.&lt;/li&gt;
&lt;li&gt;Browser extensions for instant word lookup.&lt;/li&gt;
&lt;li&gt;Writing assistants.&lt;/li&gt;
&lt;li&gt;Educational applications.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I'm also building an Android dictionary application called &lt;strong&gt;Lexicall&lt;/strong&gt;, which is one of the projects that makes this API particularly interesting to me.&lt;/p&gt;

&lt;p&gt;Building an actual client application has helped me think beyond simply returning JSON responses. API usability, response structures, search performance, and caching all become much more important when there's a real application consuming the service.&lt;/p&gt;

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

&lt;p&gt;This is an ongoing project, and there's still plenty I'd like to improve.&lt;/p&gt;

&lt;p&gt;Some areas I'm interested in exploring further include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Improving dictionary data coverage.&lt;/li&gt;
&lt;li&gt;Optimising search and database queries.&lt;/li&gt;
&lt;li&gt;Expanding language and translation support.&lt;/li&gt;
&lt;li&gt;Improving caching and API performance.&lt;/li&gt;
&lt;li&gt;Making the documentation and developer experience better.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I'd also love to hear how other developers use the API and what features they would find useful.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try the API
&lt;/h2&gt;

&lt;p&gt;If you're building something that needs English dictionary data, feel free to give it a try.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;API Documentation:&lt;/strong&gt; &lt;a href="https://api.suvankar.cc/docs/dictionary" rel="noopener noreferrer"&gt;https://api.suvankar.cc/docs/dictionary&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Source Code:&lt;/strong&gt; &lt;a href="https://github.com/suvankar-mitra/free-dictionary-rest-api" rel="noopener noreferrer"&gt;https://github.com/suvankar-mitra/free-dictionary-rest-api&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;No API key required. Just make a request and start building.&lt;/p&gt;

&lt;p&gt;The API code is open source under the Apache License 2.0. The dictionary data is sourced from Wiktionary and licensed under CC BY-SA 4.0. Please refer to the repository for licensing and attribution details.&lt;/p&gt;

&lt;p&gt;If you have feedback, suggestions, or ideas for improvement, I'd genuinely love to hear them.&lt;/p&gt;

&lt;p&gt;Thanks for reading!&lt;/p&gt;

</description>
      <category>java</category>
      <category>springboot</category>
      <category>opensource</category>
      <category>api</category>
    </item>
  </channel>
</rss>
