<?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>Forem: ApyHub</title>
    <description>The latest articles on Forem by ApyHub (@apyhub).</description>
    <link>https://forem.com/apyhub</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%2Forganization%2Fprofile_image%2F6151%2F4d0439b6-8244-4fff-9d3c-a0a65faa3803.png</url>
      <title>Forem: ApyHub</title>
      <link>https://forem.com/apyhub</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/apyhub"/>
    <language>en</language>
    <item>
      <title>ApyHub API Integration Guide for Bubble Developers</title>
      <dc:creator>Sohail Pathan</dc:creator>
      <pubDate>Tue, 04 Mar 2025 07:53:39 +0000</pubDate>
      <link>https://forem.com/apyhub/apyhub-api-integration-guide-for-bubble-developers-653</link>
      <guid>https://forem.com/apyhub/apyhub-api-integration-guide-for-bubble-developers-653</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;This guide will help Bubble developers integrate ApyHub APIs into their applications. ApyHub provides a suite of APIs for file conversion, data transformation, and more. In this guide, you’ll learn how to set up and use the following APIs in Bubble:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://apyhub.com/utility/converter-doc-pdf" rel="noopener noreferrer"&gt;Convert Word to PDF&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://apyhub.com/utility/html-to-docx" rel="noopener noreferrer"&gt;Convert HTML to Word&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://apyhub.com/utility/converter-html-pdf" rel="noopener noreferrer"&gt;Convert HTML to PDF&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://apyhub.com/utility/converter-json-csv" rel="noopener noreferrer"&gt;Convert JSON to CSV&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;p&gt;Before you begin, ensure you have the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;A Bubble account to create and edit apps.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;An &lt;a href="https://apyhub.com/auth/signup" rel="noopener noreferrer"&gt;ApyHub account&lt;/a&gt; to obtain your API token.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Basic familiarity with Bubble’s interface, workflows, and API connector.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Setting Up the API Connector
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Step 1: Add the API Connector Plugin
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Go to the &lt;strong&gt;Plugins&lt;/strong&gt; tab in your Bubble app.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Search for and add the &lt;strong&gt;API Connector&lt;/strong&gt; plugin.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fttalj6k8kfikeu796gwf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fttalj6k8kfikeu796gwf.png" alt="install-new-plugin-screen" width="800" height="532"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Step 2: Configure the APIs
&lt;/h3&gt;

&lt;p&gt;For each API, create a new API call in the API connector. Below are the details for each API.&lt;/p&gt;

&lt;h3&gt;
  
  
  API 1: Convert Word to PDF
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Endpoint: &lt;a href="https://api.apyhub.com/convert/word-file/pdf-url" rel="noopener noreferrer"&gt;https://api.apyhub.com/convert/word-file/pdf-url&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Method: &lt;code&gt;POST&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Headers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Content-Type: &lt;code&gt;application/json&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;  apy-token: &lt;code&gt;Your_ApyHub_Token&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhwtedw8ddxfunz9wpakl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhwtedw8ddxfunz9wpakl.png" alt="word-to-pdf-extension" width="800" height="504"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  API 2: Convert HTML to Word
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Endpoint: &lt;a href="https://api.apyhub.com/convert/html-file/doc-url" rel="noopener noreferrer"&gt;https://api.apyhub.com/convert/html-file/doc-url&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Method: &lt;code&gt;POST&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Headers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Content-Type: &lt;code&gt;application/json&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;  apy-token: &lt;code&gt;Your_ApyHub_Token&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi2ybc60hsy8n1qh91v1k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi2ybc60hsy8n1qh91v1k.png" alt="html-to-word-integration" width="800" height="507"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  API 3: Convert HTML to PDF
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Endpoint: &lt;a href="https://api.apyhub.com/convert/html-file/pdf-url" rel="noopener noreferrer"&gt;https://api.apyhub.com/convert/html-file/pdf-url&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Method: POST&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Headers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Content-Type: &lt;code&gt;application/json&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;  apy-token: &lt;code&gt;Your_ApyHub_Token&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgvonkpz4tx16yhsocygb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgvonkpz4tx16yhsocygb.png" alt="html-to-pdf-extension" width="800" height="493"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  API 4: Convert JSON to CSV
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Endpoint: &lt;a href="https://api.apyhub.com/convert/json-raw/csv-url" rel="noopener noreferrer"&gt;https://api.apyhub.com/convert/json-raw/csv-url&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Method: &lt;code&gt;POST&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Headers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Content-Type: &lt;code&gt;application/json&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;  apy-token: &lt;code&gt;Your_ApyHub_Token&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8qrsaoq44q3ey1bfs6rh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8qrsaoq44q3ey1bfs6rh.png" alt="json-to-csv-integation" width="800" height="578"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;h3&gt;
  
  
  Step 1: Create the UI
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt; Add the following elements to your Bubble app:&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;File upload input.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Dropdowns for input and output formats.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Buttons to trigger conversions.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Input for JSON input.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Display areas for results (e.g., download links).&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqwmp1so6xel7ipy4arx0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqwmp1so6xel7ipy4arx0.png" alt="document-converter-tool-screen" width="800" height="404"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Step 2: Set Up Workflows
&lt;/h3&gt;

&lt;p&gt;For each API, create a workflow that triggers when the user clicks the "Convert" button. Here’s how:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Get File&lt;/strong&gt;:&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;  Use the file upload element to get the file.&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Call the API&lt;/strong&gt;:&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Use the API connector to call the appropriate API.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Pass the file URL or JSON data as the request body.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9d240fwibu3k0znhd80d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9d240fwibu3k0znhd80d.png" alt="calling-word-to-pdf-api" width="800" height="375"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For JSON to CSV&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzmz1vz2ai8rca2ctcuz9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzmz1vz2ai8rca2ctcuz9.png" width="800" height="366"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Save and Display the Result:&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Save the API response (e.g., converted file URL) in a Bubble data type.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Display the result (e.g., a download link) to the user.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq6c1tcjyfspr15dlm2tz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq6c1tcjyfspr15dlm2tz.png" alt="save-and-display-the-result" width="800" height="448"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbir6ygyjcb9i5oaamf0k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbir6ygyjcb9i5oaamf0k.png" alt="final-app" width="800" height="453"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Congratulations! You’ve successfully integrated ApyHub APIs into your Bubble app. This guide covered the setup for four APIs, including file conversion and JSON to CSV transformation. You can now expand the app’s functionality by exploring other &lt;a href="http://apyhub.com/catalog" rel="noopener noreferrer"&gt;ApyHub APIs&lt;/a&gt;.  &lt;/p&gt;

&lt;p&gt;Link to our demo app: &lt;a href="https://apyhub-integration.bubbleapps.io/version-test" rel="noopener noreferrer"&gt;https://apyhub-integration.bubbleapps.io/version-test&lt;/a&gt;&lt;/p&gt;

</description>
      <category>bubble</category>
      <category>webdev</category>
      <category>nocode</category>
      <category>api</category>
    </item>
    <item>
      <title>Exploring the Top SERP (Search Engine Result Pages) APIs</title>
      <dc:creator>Sohail Pathan</dc:creator>
      <pubDate>Wed, 03 Apr 2024 12:10:36 +0000</pubDate>
      <link>https://forem.com/apyhub/exploring-the-top-serp-search-engine-result-pages-apis-5b9m</link>
      <guid>https://forem.com/apyhub/exploring-the-top-serp-search-engine-result-pages-apis-5b9m</guid>
      <description>&lt;h2&gt;
  
  
  Introduction:
&lt;/h2&gt;

&lt;p&gt;Search Engine Results Page (SERP) is the list of websites that appear after a user enters a query into a search engine, such as Google. The SERP comprises webpages, images, videos, and other content relevant to the query.&lt;/p&gt;

&lt;p&gt;The Search Engine Results Page is determined by algorithms that assess the relevance of webpages about any query, as well as other factors like page authority and content quality.&lt;/p&gt;

&lt;p&gt;The SERP results can be broadly categorized into two categories:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Organic results&lt;/strong&gt;: Organic means the results are those that appear naturally in the SERP and are not bought or sponsored by any company.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Paid results&lt;/strong&gt;: Paid results are sponsored or bought by companies and typically appear at the top or bottom of the SERP.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For more information around SERP, you can read &lt;a href="https://apyhub.com/blog/serp-meaning-usecases-approaches"&gt;a previous blog&lt;/a&gt; that we wrote.&lt;/p&gt;

&lt;h2&gt;
  
  
  Features &amp;amp; Functionality
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Search Engine Support:
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://apyhub.com/utility/serp-rank"&gt;ApyHub&lt;/a&gt; allows extracting SERP ranking for Google Search and upcoming support for DuckDuckGo, Bing, Yandex, and Baidu. &lt;a href="https://brightdata.com/products/serp-apihttps://brightdata.com/products/serp-api"&gt;Brightdata&lt;/a&gt; allows extracting SERP ranking for Google DuckDuckGo, Bing, Yandex, and Baidu. Similarly, &lt;a href="https://dataforseo.com/apis/serp-api"&gt;DataforSEO&lt;/a&gt; allows extracting SERP rankings for Google, Yahoo, Bing, and Baidu. Oxylabs allows extracting SERP for Google, Bing, Baidu, and Yandex.&lt;/p&gt;

&lt;h3&gt;
  
  
  Localized Search Rankings:
&lt;/h3&gt;

&lt;p&gt;ApyHub, Brightdata, and Oxylabs allow you to extract page rankings for specific locations and language. DataForSEO allows you to extract page ranking with some additional parameters including location, language, and device (Desktop and Mobile).&lt;/p&gt;

&lt;h3&gt;
  
  
  SDKs and Client Libraries
&lt;/h3&gt;

&lt;p&gt;&lt;a href="http://apyhub/"&gt;ApyHub&lt;/a&gt; allows you to generate client code in 11 languages &lt;strong&gt;C, C#, JavaScript, Go, NodeJS, Java, Kotlin, Python, Rust, Dart, and Ruby,&lt;/strong&gt; and provides &lt;a href="https://github.com/apyhub"&gt;SDKs&lt;/a&gt; in &lt;strong&gt;JavaScript and Go&lt;/strong&gt;. BrightData allows you to generate client code in 8 languages and includes &lt;strong&gt;NodeJS, Java, C#, PHP, Python, Ruby, and Perl&lt;/strong&gt;. DataForSEO allows you to generate client code in 4 languages including &lt;strong&gt;NodeJS, Python, PHP, and C#.&lt;/strong&gt; Oxylabs allows you to generate client code in 6 languages including &lt;strong&gt;Python, PHP, C#, Go, and NodeJS&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--SOXNNJi6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://assets.apyhub.com/blog/top-serp-apis/image1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--SOXNNJi6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://assets.apyhub.com/blog/top-serp-apis/image1.png" alt="BrightData Client Code Generation Page" width="800" height="413"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;BrightData Client Code Generation Page&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Documentation and Tutorials:
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://apyhub.com/utility/serp-rank"&gt;Apyhub&lt;/a&gt; APIs are supported with thorough documentation, including the &lt;strong&gt;Authentication method, Error Codes, HTTP Response Codes, and Request Examples&lt;/strong&gt;. &lt;a href="https://docs.brightdata.com/scraping-automation/serp-api/introduction"&gt;Brightdata&lt;/a&gt; provides very comprehensive documentation including a quick start guide and code examples.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.dataforseo.com/v3/serp/overview/"&gt;DataForSEO&lt;/a&gt; and &lt;a href="https://developers.oxylabs.io/scraper-apis/serp-scraper-api"&gt;Oxylabs&lt;/a&gt; have provided documentation in the form of a guide that is easily understandable.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--CQQ_ve7e--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://assets.apyhub.com/blog/top-serp-apis/image3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--CQQ_ve7e--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://assets.apyhub.com/blog/top-serp-apis/image3.png" alt="Documentation Page DataForSEO SERP APIs" width="800" height="391"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Documentation Page DataForSEO SERP APIs&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  API Testing:
&lt;/h3&gt;

&lt;p&gt;Most of the providers let you test the APIs right from a terminal in the platform. Brightdata also provides an interactive &lt;strong&gt;API Playground&lt;/strong&gt; for developers to test and check SERP Ranking for multiple search engines. &lt;a href="http://apyhub.com/"&gt;ApyHub&lt;/a&gt; also has an &lt;strong&gt;API Playground&lt;/strong&gt; where you can test the APIs in the UI plus you can see the snippet of the provided input in cURL. DataForSEO and Oxylabs don’t provide any internal tool for API tests but provide cURL request code to test on API Clients&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--2bJ2u8zH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://assets.apyhub.com/blog/top-serp-apis/image2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--2bJ2u8zH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://assets.apyhub.com/blog/top-serp-apis/image2.png" alt="ApyHub’s API Playground: Testing SERP Rank Checker API" width="800" height="397"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;ApyHub’s API Playground: Testing SERP Rank Checker API&lt;/p&gt;

&lt;h3&gt;
  
  
  Availability:
&lt;/h3&gt;

&lt;p&gt;&lt;a href="http://apyhub.com/"&gt;ApyHub&lt;/a&gt; has served *99.99% of uptime. &lt;a href="https://brightdata.com/network-status"&gt;BrightData&lt;/a&gt;, &lt;a href="https://status.dataforseo.com/"&gt;DataforSEO&lt;/a&gt;, and &lt;a href="https://uptime.oxylabs.io/"&gt;Oxylabs&lt;/a&gt; also claim to have high uptime.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pricing:
&lt;/h3&gt;

&lt;p&gt;This is subject to change but at the time of writing, all providers offer a subscription-based tiered model including a free plan. The most generous free plan is from &lt;a href="http://apyhub.com/"&gt;ApyHub&lt;/a&gt;, offering 2 Million API calls per month for free. Oxylabs offers up to 5000 API Calls per month under a free plan. BrightData and DataForSEO don’t offer any free plan and allow you to consume API using pay-as-you-go.&lt;/p&gt;

&lt;h2&gt;
  
  
  Community Support:
&lt;/h2&gt;

&lt;p&gt;Most of the providers offer dedicated channels such as Discord, Slack, or Chatbot Agent to their users to ask support questions. &lt;a href="http://apyhub.com/"&gt;ApyHub&lt;/a&gt; has a dedicated &lt;a href="https://discord.gg/KcjnPHef7p"&gt;Discord&lt;/a&gt; Server, which lets you interact directly with the support team in addition to &lt;a href="//mailto:hello@apyhub.com"&gt;email support&lt;/a&gt;. Brightdata offers plan-based support which includes email support a dedicated Slack channel and a Technical Account Manager. DataForSEO and Oxylabs provide chatbot agents and email support.&lt;/p&gt;

&lt;p&gt;Below is a summary of the comparison of the providers I looked at.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Provider&lt;/th&gt;
&lt;th&gt;# Calls (Free)&lt;/th&gt;
&lt;th&gt;Input parameters&lt;/th&gt;
&lt;th&gt;Output Parameters&lt;/th&gt;
&lt;th&gt;Pricing ( Paid )&lt;/th&gt;
&lt;th&gt;Throttling&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;ApyHub&lt;/td&gt;
&lt;td&gt;Up to 2 Million API Calls / Month&lt;/td&gt;
&lt;td&gt;Keyword, location, language&lt;/td&gt;
&lt;td&gt;Type, rank, title, description, domain, link breadcrumb&lt;/td&gt;
&lt;td&gt;Starting from 10 EUR/month&lt;/td&gt;
&lt;td&gt;1 call/s in the free plan&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BrightData&lt;/td&gt;
&lt;td&gt;No Free API calls.&lt;/td&gt;
&lt;td&gt;Keyword, website, location, language&lt;/td&gt;
&lt;td&gt;rank, title, description, link&lt;/td&gt;
&lt;td&gt;Starting from 10 USD/month&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DataForSEO&lt;/td&gt;
&lt;td&gt;No Free API cal&lt;/td&gt;
&lt;td&gt;Keyword, website, location, language, device&lt;/td&gt;
&lt;td&gt;Type, rank, Absolute rank, title, domain description, link&lt;/td&gt;
&lt;td&gt;No Monthly Subscription. Pay-as-you-go starts at 0.6 USD/ API call.&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Oxylabs&lt;/td&gt;
&lt;td&gt;Up to 5000 API Calls / Month&lt;/td&gt;
&lt;td&gt;Keyword, website, location, language&lt;/td&gt;
&lt;td&gt;Position, Position Overall, title, description, link&lt;/td&gt;
&lt;td&gt;Starting from 49 USD/month&lt;/td&gt;
&lt;td&gt;5 call/s in the free plan&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;When it comes to extracting SERP Ranking - &lt;a href="http://apyhub.com/"&gt;ApyHub&lt;/a&gt;, BrightData, DataForSEO and Oxylabs all provide unique features and benefits for developers. Depending on the specific project requirements, developers can choose the API that best suits their needs.&lt;/p&gt;

&lt;p&gt;With factors such as supported language, and location for keywords, developers can make a decision and leverage the most useful API to streamline their SERP extraction workflow from search engines.&lt;/p&gt;

&lt;p&gt;Do you agree with our list of the above API Providers? What do you think is the best SERP Rank Extractor API? Let us know your thoughts in the comments below.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Disclaimer: This article is for informational purposes only. The opinions expressed are solely based on the research and may vary based on individual experiences and preferences.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>serp</category>
      <category>api</category>
      <category>developertool</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Extending the capabilities of Low/No-Code Platforms with third-party APIs</title>
      <dc:creator>Sohail Pathan</dc:creator>
      <pubDate>Fri, 16 Feb 2024 13:08:14 +0000</pubDate>
      <link>https://forem.com/apyhub/extending-the-capabilities-of-lowno-code-platforms-with-third-party-apis-10kd</link>
      <guid>https://forem.com/apyhub/extending-the-capabilities-of-lowno-code-platforms-with-third-party-apis-10kd</guid>
      <description>&lt;h2&gt;
  
  
  Introduction:
&lt;/h2&gt;

&lt;p&gt;One of the hottest “movements” that is taking over the software development world is the rise of no-code and low-code tools and platforms. This new way of developing and releasing software is quite revolutionary as it is transforming the way software applications are designed, developed, deployed, and managed. It can even be argued that this innovation is in a way democratizing software and technology, making it even more accessible to a broader audience beyond the traditional tech-savvy developers. In this blog post, we will have a look at some of these trends, understand what no/low-code platforms are, their benefits as well as limitations, and finally see how their use cases and capabilities can be extended through the use of 3rd party APIs.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is a Low/No-Code?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Low-code&lt;/strong&gt; and &lt;strong&gt;no-code&lt;/strong&gt; are software development methodologies that allow individuals to create software applications through easy-to-use and easy-to-navigate user interfaces and configurations, instead of traditional computer programming. It is about building software without writing a lot of code (or not writing code at all) by leveraging UI components to design the app’s flow and interface.&lt;/p&gt;

&lt;p&gt;More specifically, &lt;strong&gt;No-code platforms&lt;/strong&gt; provide a suite of pre-built elements that users can arrange to build their applications. This drag-and-drop kind of interface simplifies app development to the point where virtually anyone can design and deploy functional apps without prior coding knowledge.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Low-code platforms are similar but&lt;/strong&gt; still require some coding - still, they abstract away much of the complexity of traditional software development. They do that through the provision of visual development environments and reusable components that can accelerate development with minimal hand-coding.&lt;/p&gt;

&lt;p&gt;I liked this brief &lt;a href="https://www.youtube.com/watch?v=B9k9ijswru8"&gt;explainer video&lt;/a&gt; explaining the no-code and its unique value.&lt;/p&gt;

&lt;h2&gt;
  
  
  Are Low-code and No-code the same thing?
&lt;/h2&gt;

&lt;p&gt;Well, obviously not. However, both approaches reside on the same side of the development spectrum — &lt;strong&gt;they try to avoid needing to write a lot of code to make software&lt;/strong&gt;. They remove the complexity from software development while making it easier to manage the enormous volume and complexity of code that’s needed for today’s enterprises.&lt;/p&gt;

&lt;p&gt;For the purposes of this blog, we will refer to all of them as low/no-code platforms.&lt;/p&gt;

&lt;h2&gt;
  
  
  How does a Low/No-code tool work?
&lt;/h2&gt;

&lt;p&gt;No-code tools abstract software development from a programming language, including logic and syntax. Objects, elements, and components — such as visual boxes — represent tasks. A user combines and arranges these objects to build an application.&lt;/p&gt;

&lt;p&gt;In a no-code environment, data abstraction hides the underlying instructions and details and only displays the required functionality. An app or tool is usually represented by visual objects and mapping features that show how various elements interconnect.&lt;/p&gt;

&lt;h2&gt;
  
  
  Benefits of Low/No-Code Tools:
&lt;/h2&gt;

&lt;p&gt;Low/No-code brings some great benefits to developers across the world.  These benefits include:&lt;/p&gt;

&lt;p&gt;Low/No-code brings some great benefits to developers across the world. These benefits include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Reduced Costs:&lt;/strong&gt; &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Using low/no-code platforms can result in lower expenses. Since software applications can be built visually by non-tech individuals, this can have significant benefits when it comes to lowering costs and expenses.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Faster Time-to-Market:&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With low/no-code platforms, software applications and new features can be brought to the market quicker, sometimes in just hours or days. This accelerated time-to-market gives businesses more agility and a clear competitive edge.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Improved Efficiency:&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Automating repetitive tasks and processes with no-code can improve operational efficiency. Since workloads are reduced, the developers and engineers can focus on high-value activities.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;IT Democratization:&lt;/strong&gt; &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Low/no code opens the door for non-developers to be able to contribute to and build software that matters. This democratizes software creation across the business and can free up necessary IT resources.&lt;/p&gt;

&lt;h2&gt;
  
  
  Limitations of Low/No-Code Tools:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Limited Customization&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;The ability to customize applications may hit a ceiling, confined by the boundaries of what each low/no code platform allows.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Scalability Issues&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;The low/no-code platforms can prove to be unsuitable for complex and large-scale projects requiring a high degree of customization.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Platform Limitations&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;The users are kind of dependent on the platform's capabilities and restrictions which can hinder the project's scope. This is where using external APIs as a service can play a pivotal role since it can reduce some of these limitations.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Integration Challenges&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;Not all low/no-code platforms can integrate with the tools or systems that every organization uses.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Who is Low/No-Code for?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;(The most obvious one) Non-technical users:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Those who are keen to create apps but don’t have a coding background, such as business analysts, marketing professionals, and product managers.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Programming Novices&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;Those who lack programming or have no experience in software development and are looking to create simple applications quickly.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Design Enthusiasts&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;Those who prefer visual development environments will find low/no-code platforms incredibly user-friendly and efficient.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Startup Founders:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Those who want to prototype an idea quickly or build a minimum viable product (MVP) without investing a lot of time and resources.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Some popular Low/No-Code Tools:
&lt;/h2&gt;

&lt;p&gt;Let’s highlight a few champions in the no-code arena:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="http://retool.com/"&gt;Retool&lt;/a&gt;:&lt;/strong&gt; A powerful tool that bridges the gap between databases and the applications needed to build.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--lsPDfdom--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://assets.apyhub.com/blog/extending-capabilities-low-no-code-platforms-third-party-apis/image7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--lsPDfdom--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://assets.apyhub.com/blog/extending-capabilities-low-no-code-platforms-third-party-apis/image7.png" alt="retool" width="800" height="421"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://www.softr.io/"&gt;Softr&lt;/a&gt;:&lt;/strong&gt; Ideal for building web applications, online databases, and websites without diving into code.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Q4BcWH4P--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://assets.apyhub.com/blog/extending-capabilities-low-no-code-platforms-third-party-apis/image16.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Q4BcWH4P--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://assets.apyhub.com/blog/extending-capabilities-low-no-code-platforms-third-party-apis/image16.png" alt="softr" width="800" height="421"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://www.dronahq.com/"&gt;DronaHQ:&lt;/a&gt;:&lt;/strong&gt; A versatile platform for building internal tools and business applications efficiently.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--bMMGGiQq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://assets.apyhub.com/blog/extending-capabilities-low-no-code-platforms-third-party-apis/image2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--bMMGGiQq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://assets.apyhub.com/blog/extending-capabilities-low-no-code-platforms-third-party-apis/image2.png" alt="dronaHQ" width="800" height="421"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://www.appsmith.com/"&gt;Appsmith&lt;/a&gt;:&lt;/strong&gt; Focuses on letting developers create internal tools quickly through a rich set of pre-built widgets.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--4IpVN3lg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://assets.apyhub.com/blog/extending-capabilities-low-no-code-platforms-third-party-apis/image4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--4IpVN3lg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://assets.apyhub.com/blog/extending-capabilities-low-no-code-platforms-third-party-apis/image4.png" alt="appsmith" width="800" height="421"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://flutterflow.io/"&gt;FlutterFlow&lt;/a&gt;:&lt;/strong&gt; A visual builder for creating mobile applications using Flutter and Dart, incorporating a wide range of functionalities with a simple drag-and-drop.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--PFhQNsnW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://assets.apyhub.com/blog/extending-capabilities-low-no-code-platforms-third-party-apis/image15.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--PFhQNsnW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://assets.apyhub.com/blog/extending-capabilities-low-no-code-platforms-third-party-apis/image15.png" alt="flutter-flow" width="800" height="421"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://webflow.com/"&gt;Webflow&lt;/a&gt;:&lt;/strong&gt; A web design and development platform that empowers users to create professional websites without needing to write code.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--xRHHCj2Z--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://assets.apyhub.com/blog/extending-capabilities-low-no-code-platforms-third-party-apis/image11.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--xRHHCj2Z--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://assets.apyhub.com/blog/extending-capabilities-low-no-code-platforms-third-party-apis/image11.png" alt="webflow" width="800" height="421"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://budibase.com/"&gt;Budibase&lt;/a&gt;:&lt;/strong&gt;  An open-source platform for rapidly building internal apps and workflows.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--5uj2w63p--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://assets.apyhub.com/blog/extending-capabilities-low-no-code-platforms-third-party-apis/image3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--5uj2w63p--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://assets.apyhub.com/blog/extending-capabilities-low-no-code-platforms-third-party-apis/image3.png" alt="Budibase" width="800" height="421"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://www.builder.io/"&gt;Builder.io&lt;/a&gt;:&lt;/strong&gt; A drag-and-drop website and mobile app builder requiring no code for quick development and integration with cloud service providers.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--RaTSqT5X--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://assets.apyhub.com/blog/extending-capabilities-low-no-code-platforms-third-party-apis/image1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--RaTSqT5X--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://assets.apyhub.com/blog/extending-capabilities-low-no-code-platforms-third-party-apis/image1.png" alt="Builder.io" width="800" height="421"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://www.jetadmin.io/"&gt;JetAdmin&lt;/a&gt;:&lt;/strong&gt; A visual builder for quickly building admin panels, CRUD applications, and internal tools.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ZR_0MPOj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://assets.apyhub.com/blog/extending-capabilities-low-no-code-platforms-third-party-apis/image8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ZR_0MPOj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://assets.apyhub.com/blog/extending-capabilities-low-no-code-platforms-third-party-apis/image8.png" alt="JetAdmin" width="800" height="421"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://dashjoin.com/"&gt;Dashjoin&lt;/a&gt;:&lt;/strong&gt; An open-source &amp;amp; cloud-native development and integration platform for building data-driven apps.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--tVRh3p8t--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://assets.apyhub.com/blog/extending-capabilities-low-no-code-platforms-third-party-apis/image9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--tVRh3p8t--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://assets.apyhub.com/blog/extending-capabilities-low-no-code-platforms-third-party-apis/image9.png" alt="dashjoin" width="800" height="421"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://www.windmill.dev/"&gt;Windmill&lt;/a&gt;:&lt;/strong&gt; An open-source platform and workflow engine that transforms scripts into automated UIs, APIs, and cron jobs, enabling composition as workflows or data pipelines to easily build complex, data-intensive UIs.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--59nkt4W---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://assets.apyhub.com/blog/extending-capabilities-low-no-code-platforms-third-party-apis/image6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--59nkt4W---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://assets.apyhub.com/blog/extending-capabilities-low-no-code-platforms-third-party-apis/image6.png" alt="windmill" width="800" height="421"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://interval.com/"&gt;Interval&lt;/a&gt;:&lt;/strong&gt; Interval allows developers to build web applications and internal tools by writing only backend code in Node.js and Python.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--hvfEyRPu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://assets.apyhub.com/blog/extending-capabilities-low-no-code-platforms-third-party-apis/image12.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--hvfEyRPu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://assets.apyhub.com/blog/extending-capabilities-low-no-code-platforms-third-party-apis/image12.png" alt="interval" width="800" height="421"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://saltcorn.com/"&gt;Saltcorn&lt;/a&gt;:&lt;/strong&gt; A tool for building database web applications using intuitive point-and-click, drag-and-drop user interface.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--RsYrl9AV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://assets.apyhub.com/blog/extending-capabilities-low-no-code-platforms-third-party-apis/image10.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--RsYrl9AV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://assets.apyhub.com/blog/extending-capabilities-low-no-code-platforms-third-party-apis/image10.png" alt="Saltcorn" width="800" height="421"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://www.usebracket.com/"&gt;Brackets&lt;/a&gt;:&lt;/strong&gt; Brackets set up fast, flexible one-way or two-way syncs between CRMs like Salesforce and databases like Postgres for apps and internal flows.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--4Sf5FSsO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://assets.apyhub.com/blog/extending-capabilities-low-no-code-platforms-third-party-apis/image17.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--4Sf5FSsO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://assets.apyhub.com/blog/extending-capabilities-low-no-code-platforms-third-party-apis/image17.png" alt="Brackets" width="800" height="421"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://www.tooljet.com/"&gt;ToolJet:&lt;/a&gt;&lt;/strong&gt; An open-source tool for rapidly building internal apps and workflows.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--r4cou0u2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://assets.apyhub.com/blog/extending-capabilities-low-no-code-platforms-third-party-apis/image14.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--r4cou0u2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://assets.apyhub.com/blog/extending-capabilities-low-no-code-platforms-third-party-apis/image14.png" alt="tooljet" width="800" height="421"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://airforms.com/"&gt;Air forms&lt;/a&gt;:&lt;/strong&gt; A cloud-based no-code solution for creating forms, surveys, and workflows to streamline business processes.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--A13tS5DA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://assets.apyhub.com/blog/extending-capabilities-low-no-code-platforms-third-party-apis/image13.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--A13tS5DA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://assets.apyhub.com/blog/extending-capabilities-low-no-code-platforms-third-party-apis/image13.png" alt="airform" width="800" height="421"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  The Role of APIs in No-Code
&lt;/h1&gt;

&lt;p&gt;As we discussed before, one of the main problems that users who build software with no/low code platforms face is the limitation and the dependency on a platform's existing capabilities and features. Especially for non-developers, what the low/no-code platforms offer out of the box becomes the de facto toolset and creates a “ceiling” on what the application can achieve. This is where third-party APIs can fit into the story: Additional features and additional blocks that can be used to extend the capabilities that the low/no code platform is offering.&lt;/p&gt;

&lt;p&gt;APIs can introduce additional security layers, bypass platform constraints, and, most importantly, enrich apps with capabilities that are not natively supported by the no-code tool.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Role of API Catalogs
&lt;/h2&gt;

&lt;p&gt;A consolidated API catalog can serve as a treasure trove, simplifying the way that low/no code developers discover and consume APIs in their applications. It's a centralized repository where developers can find and connect to various APIs. This is important since, remember, some of the users of low/no-code platforms do not have a strong technical background - this means that it is very important that they can easily find, discover, and connect to different APIs, according to their needs, with a similar integration process.&lt;/p&gt;

&lt;p&gt;The main advantages of using API catalogs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Simplified Discovery:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;API catalogs allow easy browsing and finding relevant APIs in one place rather than having to scour the web and possibly have to subscribe to multiple services*&lt;em&gt;.&lt;/em&gt;*&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Faster Integration:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Catalogs standardize how to work with APIs, provide code samples and SDKs, and make it easy to start integrating APIs in just minutes.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Higher Quality:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Reputable API platforms screen providers for things like reliability, security, and documentation quality.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Reduced Risks:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Catalogs help identify secure, compliant, and well-supported APIs from vetted providers*&lt;em&gt;.&lt;/em&gt;*&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Improved Productivity:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;With easier discovery and integration, developers can focus on building apps rather than API plumbing.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Access to AI:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Catalogs provide discovery and streamlined access to various &lt;a href="https://apyhub.com/catalog/artificial-intelligence"&gt;AI APIs&lt;/a&gt; like speech, language, vision, and predictive analytics.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  ApyHub: The all-in-one API catalog
&lt;/h2&gt;

&lt;p&gt;ApyHub is an API catalog that offers more than &lt;a href="http://apyhub.com/catalog"&gt;100+ Utilitiy APIs&lt;/a&gt; that help developers to integrate complex functionalities just using REST API calls and without building and deploying on their own.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--OIJBHIIl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://assets.apyhub.com/blog/extending-capabilities-low-no-code-platforms-third-party-apis/image5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--OIJBHIIl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://assets.apyhub.com/blog/extending-capabilities-low-no-code-platforms-third-party-apis/image5.png" alt="apyhub" width="800" height="421"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;ApyHub’s  APIs are ready to be integrated into no-code applications. Whether through REST API or connectors, ApyHub facilitates easy integration, opening up possibilities for pre-built functionalities and accelerated development timelines. ApyHub offers Utility APIs in different categories such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://apyhub.com/catalog/file-conversion"&gt;File Conversion APIs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://apyhub.com/catalog/artificial-intelligence"&gt;AI-enabled APIs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://apyhub.com/catalog/data-validation"&gt;Data Validation APIs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://apyhub.com/catalog/data-extractor"&gt;Data Extraction APIs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://apyhub.com/catalog/file-security"&gt;Data Security APIs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://apyhub.com/catalog/commerce-quick-tools"&gt;E-commerce APIs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://apyhub.com/catalog/image-processor"&gt;Image Processing APIs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://apyhub.com/search?query=Video&amp;amp;category=&amp;amp;tags=&amp;amp;page=0&amp;amp;sortBy=Relevance"&gt;Video Processing APIs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://apyhub.com/utility/audio-converter-wav-mp3"&gt;Audio Processing APIs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Looking for some help to get started? Have a look at some guides we have started putting together for &lt;a href="https://apyhub.com/blog/apyhub-retool-standard-integration"&gt;Retool&lt;/a&gt; and &lt;a href="https://apyhub.com/blog/building-workspace-reservations-app-apyhub-dronahq"&gt;DronaHQ&lt;/a&gt;. We are keen to keep writing and helping low/no code developers so let us know if you would like some help with a specific platform.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;As we have discussed, the low/no-code movement is reshaping the tech landscape, making software application development more accessible to a much broader audience. While low/no-code platforms offer a convenient and efficient way to build software, integrating third-party API can significantly extend their capabilities and overcome some of the limitations that are there. Both for starters or seasoned developers, exploring the synergies between low/no-code tools and API catalogs like &lt;a href="https://apyhub.com/catalog"&gt;ApyHub&lt;/a&gt; could be the next step toward building more dynamic, powerful, and integrated applications.&lt;/p&gt;

&lt;p&gt;About ApyHub:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apyhub.com/"&gt;ApyHub&lt;/a&gt; is a leading platform for API design, discovery, and integration, empowering developers and development teams worldwide to discover, access, and consume standard data and common functionality APIs seamlessly inside their applications. With a comprehensive growing API catalog (currently +100 APIs), API design tools and resources, ApyHub streamlines the process of building and running innovative applications that can scale.&lt;/p&gt;

</description>
      <category>nocode</category>
      <category>retool</category>
      <category>discuss</category>
      <category>devops</category>
    </item>
    <item>
      <title>Exploring the Top Document Conversion APIs: ApyHub vs. CloudConvert vs. ConvertAPI vs. Cloudmersive</title>
      <dc:creator>Sohail Pathan</dc:creator>
      <pubDate>Thu, 05 Oct 2023 12:45:33 +0000</pubDate>
      <link>https://forem.com/apyhub/exploring-the-top-document-conversion-apis-apyhub-vs-cloudconvert-vs-convertapi-vs-cloudmersive-4i6p</link>
      <guid>https://forem.com/apyhub/exploring-the-top-document-conversion-apis-apyhub-vs-cloudconvert-vs-convertapi-vs-cloudmersive-4i6p</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;As a developer, you have likely experienced the need to convert and deliver docs to others in your apps — and though there are a variety of file types, chances are your app has required conversion from an MS Word doc or PDF.&lt;/p&gt;

&lt;h2&gt;
  
  
  What are Document Conversion APIs?
&lt;/h2&gt;

&lt;p&gt;These are APIs that can take a source input file in the form of docx, doc or PDF and convert them to PDF. As we have discussed &lt;a href="https://apyhub.com/blog/convert-docx-to-pdf-using-api"&gt;before&lt;/a&gt;, converting to PDF has multiple pros, including consistent formatting, security and reduced file size.&lt;/p&gt;

&lt;p&gt;In this blog post, we will talk about some of the available solutions out there: We’ll discuss the features, functionality, and benefits of each API which can help developers choose what suits them best based on their specific project requirements.&lt;/p&gt;

&lt;h2&gt;
  
  
  Features &amp;amp; Functionality:
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Input Methods&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;ApyHub allows you to provide source input files in both Binary and Base64 formats. CloudConvert, ConvertAPI, and CloudMersive take input as Remote URLs and Binary Files.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SDKs and Client Libraries&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;ApyHub provides the client code &amp;lt;in 8 languages (C, C#, JavaScript, Go, NodeJS, Java, Python, and PHP) and SDKs in Node.js and Go. CloudConvert provides SDKs in about 7 different languages, including PHP, Node.js, Python, Ruby, Java, and .NET. ConvertAPI currently offers the client code 7 programming languages, including Go, Python, Ruby, Java, C#, PHP, and JavaScript, but no SDKs. Cloudmersive supports 8 programming languages, including Go, Python, Ruby, Java, C#, PHP, JavaScript, and Swift.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://postimg.cc/xXDf0q9Z"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--FeOITR7Y--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://i.postimg.cc/W1thwJCs/Group-1461.png" alt="Group-1461.png" width="800" height="218"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Client Code Generator: ApyHub and ConvertAPI&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Documentation&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Apyhub APIs include thorough documentation, including the Authentication method, Error Codes, HTTP Response Codes, and Request Examples. Cloud Convert also has rich language-specific documentation but does not include Error &amp;amp; Response codes, whereas CloudMersive also has great language-specific documentation including some examples.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;API Testing&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Most of the providers let you test the APIs right from a terminal in the platform. ApyHub also has an API Playground where you can test the APIs in the UI plus you can see the snippet of the provided input in cURL.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://postimg.cc/hJKKdwzb"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--QTChYSgb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://i.postimg.cc/wBmMSY9P/playground.png" alt="playground.png" width="800" height="258"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;ApyHub’s API Playground&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Availability&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;ApyHub has served &lt;a href="https://status.apyhub.com/"&gt;*99.9% of uptime&lt;/a&gt;. Convertapi, CloudConvert, and Cloudmersive also claim to have high uptime.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Integration with No Code Tools&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;CloudConvert provides integration support as a connector or extension of tools like Zapier, Microsoft, Make, and n8n. ApyHub has developed specific &lt;a href="https://apyhub.com/blog/apyhub-retool-standard-integration"&gt;guidelines&lt;/a&gt; and &lt;a href="https://apyhub.com/blog/building-an-application-tracking-system-using-retool-and-apyhub"&gt;tutorials&lt;/a&gt; for using APIs inside no/low code platforms, including Retool, Softr DronaHQ, and others. Cloudmersive and ConvertAPI do not appear to mention anything about connecting with low code platforms.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pricing&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is subject to change but at the time of writing, all providers offer a subscription based tiered model including a free plan. The most generous free plan is from ApyHub, offering 20 Million! API calls per month for free, whereas Cloudmersive offers 800 calls per month, Covert API offers only 250 calls. Finally, CloudCovert offers 25 calls per day, so 750 calls per month.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Community Support&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Most of the providers offer dedicated channels such as Discord, Slack, or Chatbot Agent to their users to ask support questions. ApyHub has its own &lt;a href="https://discord.gg/KcjnPHef7p"&gt;Discord Server&lt;/a&gt;, which lets you interact directly with the support team. CloudConvert has email-based support, whereas ConvertAPI and Cloudmersive provide chat-based support.&lt;/p&gt;

&lt;p&gt;Below is a summary of the comparison of the providers I looked at. We focused on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;#API calls&lt;/li&gt;
&lt;li&gt;Inputs&lt;/li&gt;
&lt;li&gt;File size&lt;/li&gt;
&lt;li&gt;Pricing&lt;/li&gt;
&lt;li&gt;Throttling&lt;/li&gt;
&lt;li&gt;Storage&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Provider&lt;/th&gt;
&lt;th&gt;# Calls (Free)&lt;/th&gt;
&lt;th&gt;Inputs&lt;/th&gt;
&lt;th&gt;File Size&lt;/th&gt;
&lt;th&gt;Pricing ( Paid )&lt;/th&gt;
&lt;th&gt;Throttling&lt;/th&gt;
&lt;th&gt;Storage&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;ApyHub&lt;/td&gt;
&lt;td&gt;2M calls in the free plan&lt;/td&gt;
&lt;td&gt;BASE64, PPT, PPTX, DocX, ODF, PNG, JPEG, XLS, XLSX, HTML OR File URL&lt;/td&gt;
&lt;td&gt;50 MB&lt;/td&gt;
&lt;td&gt;Starting from 10 EUR/month. Custom pricing plan for Enterprises.&lt;/td&gt;
&lt;td&gt;1 call/s in the free plan&lt;/td&gt;
&lt;td&gt;Yes, 2 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CloudConvert&lt;/td&gt;
&lt;td&gt;25 calls Per Day&lt;/td&gt;
&lt;td&gt;DOCX, DOC, PPTX, PPT, XLS, XLSX&lt;/td&gt;
&lt;td&gt;1 GB&lt;/td&gt;
&lt;td&gt;Starting from 8.5 EUR/month&lt;/td&gt;
&lt;td&gt;1 call/in the free plan&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ConvertAPI&lt;/td&gt;
&lt;td&gt;250 calls&lt;/td&gt;
&lt;td&gt;DOCX, PPTX, XLSX, PNG, JPG, SVG, EPUB, OR File URL&lt;/td&gt;
&lt;td&gt;200 MB&lt;/td&gt;
&lt;td&gt;Starting from 76 EUR/month.&lt;/td&gt;
&lt;td&gt;1 call/in the free plan&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cloudmersive&lt;/td&gt;
&lt;td&gt;800 calls/month&lt;/td&gt;
&lt;td&gt;DOCX, DOC, PPTX, PPT, XLS, XLSX OR File URL&lt;/td&gt;
&lt;td&gt;3.5 MB&lt;/td&gt;
&lt;td&gt;Starting from 18 EUR/month.&lt;/td&gt;
&lt;td&gt;1 call/in the free plan&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Conclusion:
&lt;/h2&gt;

&lt;p&gt;When it comes to document-to-PDF conversion APIs, ApyHub, CloudConvert, ConvertAPI, and Cloudmersive all provide unique features and benefits for developers. Depending on the specific project requirements, developers can choose the API that best suits their needs.&lt;/p&gt;

&lt;p&gt;With factors such as supported file formats, conversion accuracy, integration simplicity, and additional functionalities, developers can make a decision and leverage the most useful API to streamline their document conversion workflows.&lt;/p&gt;

&lt;p&gt;Do you agree with our list of the above API Providers? What do you think is the best PDF API? Let us know your thoughts in the comments below.&lt;/p&gt;

</description>
      <category>doctopdf</category>
      <category>webdev</category>
      <category>api</category>
      <category>devops</category>
    </item>
    <item>
      <title>Generating Thumbnails from Videos using ApyHub’s API</title>
      <dc:creator>Sohail Pathan</dc:creator>
      <pubDate>Mon, 11 Sep 2023 06:48:01 +0000</pubDate>
      <link>https://forem.com/apyhub/generating-thumbnails-from-videos-using-apyhubs-api-p3k</link>
      <guid>https://forem.com/apyhub/generating-thumbnails-from-videos-using-apyhubs-api-p3k</guid>
      <description>&lt;p&gt;As we have discussed in &lt;a href="https://apyhub.com/blog/video-thumbnails-for-seo"&gt;previous articles&lt;/a&gt;, video thumbnails have a lot of benefits and possible uses, including:&lt;/p&gt;

&lt;p&gt;enhanced visual appeal, improved user experience, and of course a boost in brand identity and recognition. In this tutorial, we will go a bit more technical - focusing on the &lt;a href="https://apyhub.com/utility/video-thumbnail"&gt;ApyHub video thumbnail&lt;/a&gt; generator API.&lt;/p&gt;

&lt;p&gt;No worries, this will be extremely simple and detailed. We will go slow and step by step, guiding you through every little detail. We will cover the API's core functionalities, including how to request thumbnails from videos using simple HTTP requests.&lt;/p&gt;

&lt;p&gt;Moreover, we will show something cool: How to customize thumbnail dimensions and extract thumbnails from various time points within a video. Finally we will show how to seamlessly implement the generated thumbnails into your applications or websites&lt;/p&gt;

&lt;p&gt;First things first - We'll start by importing packages and walk you through the process to execute the file using the Node.js command.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Step 1: Set up the project&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Create a new directory for your project and navigate to it using the terminal&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="nx"&gt;mkdir&lt;/span&gt; &lt;span class="nx"&gt;video&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;thumbnail&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;api&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;nodejs&lt;/span&gt;
&lt;span class="nx"&gt;cd&lt;/span&gt; &lt;span class="nx"&gt;video&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;thumbnail&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;api&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;nodejs&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 2: Initialize Node.js Project
&lt;/h3&gt;

&lt;p&gt;Initialize a Node.js project by running the following command. This will create a package.json file.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="nx"&gt;npm&lt;/span&gt; &lt;span class="nx"&gt;init&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;y&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 3: Install Required Packages
&lt;/h3&gt;

&lt;p&gt;Install the required packages: Axios for making HTTP requests and form-data for handling multipart/form-data.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="nx"&gt;npm&lt;/span&gt; &lt;span class="nx"&gt;install&lt;/span&gt; &lt;span class="nx"&gt;axios&lt;/span&gt; &lt;span class="nx"&gt;form&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="nx"&gt;fs&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once we run &lt;code&gt;npm install&lt;/code&gt; in the terminal, the command triggers the installation of the specified dependencies listed in the project's package.json file. The following dependencies are commonly installed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;axios:&lt;/strong&gt; A popular HTTP client library for making HTTP requests in Node.js. It simplifies the process of sending HTTP requests and handling responses. In this case, axios is used to make a POST request to the Video Watermarking API, sending the video URL and watermark image URL.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;form-data:&lt;/strong&gt; form-data is a JavaScript library that provides a way to create and handle multipart/form-data requests. It allows you to easily construct and send HTTP requests that contain files or other binary data. This library is often used in conjunction with axios or other HTTP client libraries to send form-based requests with files attached.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;fs (File System)&lt;/strong&gt;: A built-in module in Node.js that provides functionalities for working with the file system. In this context, fs is used to create a write stream and save the watermarked video file. The createWriteStream function allows you to write the response data from the API request directly to a file on the local file system.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 4: Create Your Integration Script
&lt;/h3&gt;

&lt;p&gt;Create a file named &lt;strong&gt;generateThumbnail.js&lt;/strong&gt; in your project directory.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Import required packages&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;axios&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;axios&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;FormData&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;form-data&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;fs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;fs&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// API endpoint URL&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;apiUrl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://api.apyhub.com/generate/video-thumbnail/file&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Replace 'YOUR_APY_TOKEN' with your actual API token&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;apyToken&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;YOUR_APY_TOKEN&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Define the file path and details&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;videoFilePath&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/path_to_file&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;outputFileName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;PROVIDE_THE_OUTPUT_FILE_NAME&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;startTime&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;0&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;duration&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;2&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;size&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;400x300&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;generateThumbnail&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Create form data&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;form&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;FormData&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="nx"&gt;form&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;video&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createReadStream&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;videoFilePath&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="nx"&gt;form&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;start_time&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;startTime&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;form&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;duration&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;duration&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;form&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;size&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;size&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// Set headers&lt;/span&gt;
    &lt;span class="nx"&gt;form&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;apy-token&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;apiToken&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// Make POST request&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;axios&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;apiUrl&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;form&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;form&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getHeaders&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="na"&gt;params&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;output&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;outputFileName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;

    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Thumbnail generation response:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Error generating thumbnail:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&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;// Call the function to generate the thumbnail&lt;/span&gt;
&lt;span class="nf"&gt;generateThumbnail&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 5: Execute the Script&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Execute the script using the Node.js command.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="nx"&gt;node&lt;/span&gt; &lt;span class="nx"&gt;generateThumbnail&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;js&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it! It wasn't so difficult right? We have now successfully integrated the &lt;a href="https://apyhub.com/utility/video-thumbnail"&gt;Video Thumbnail API&lt;/a&gt; using Node.js!&lt;/p&gt;

&lt;p&gt;Using this service, we can generate video thumbnails from literally any part of a video file or URL (e.g. youtube). This way, we automate extracting thumbnails from videos , allowing for efficient and consistent extraction of thumbnails without the need of any manual work. This can save both time and resources for all businesses and content creators. &lt;/p&gt;

&lt;p&gt;The &lt;a href="https://apyhub.com/utility/video-thumbnail"&gt;ApyHub Video Thumbnail API&lt;/a&gt; can also be integrated into existing workflows and platforms, making it easy to incorporate thumbnail extraction into existing processes.&lt;br&gt;
Good luck with using the API. Looking forward to any feedback on &lt;a href="https://discord.gg/KcjnPHef7p"&gt;discord&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>api</category>
      <category>tutorial</category>
      <category>node</category>
      <category>videoconversion</category>
    </item>
    <item>
      <title>Video Watermarking: A Step-by-Step Guide Using Node.js and ApyHub API</title>
      <dc:creator>Sohail Pathan</dc:creator>
      <pubDate>Wed, 19 Jul 2023 11:03:45 +0000</pubDate>
      <link>https://forem.com/apyhub/video-watermarking-a-step-by-step-guide-using-nodejs-and-apyhub-api-lm1</link>
      <guid>https://forem.com/apyhub/video-watermarking-a-step-by-step-guide-using-nodejs-and-apyhub-api-lm1</guid>
      <description>&lt;p&gt;In this series so far, we have explored the &lt;a href="https://dev.to/iamspathan/exploring-video-watermarking-techniques-benefits-and-best-practices-cff"&gt;benefits, techniques, and best practices&lt;/a&gt; for video watermarking, and how it can be useful for copyright protection, branding and promotion, proof of ownership, as well as content monitoring. We also looked at the types of watermarks including visible watermarks, timecode watermarks and audio watermarks.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/iamspathan/5-top-tools-and-ways-to-watermark-your-videos-4egc"&gt;Here we explored in detail some of the top tools and ways you can effectively watermark your videos&lt;/a&gt;, including using FFmpeg, OpenCV or MoviePy. Cloud-based APIs like &lt;a href="https://cloudinary.com/"&gt;Cloudinary&lt;/a&gt;, Zencoder or &lt;a href="http://apyhub.com/"&gt;ApyHub&lt;/a&gt; can also be particularly beneficial for content creators, online education providers, or websites with various types of video content.&lt;/p&gt;

&lt;p&gt;In this article, we delve into how you can effectively use the &lt;a href="https://apyhub.com/utility/watermark-video"&gt;ApyHub Video Watermarking API&lt;/a&gt; using Node JS.&lt;/p&gt;

&lt;p&gt;To add an image watermark to a video using Node.js, follow the step-by-step tutorial below:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Install the required libraries:
&lt;/h3&gt;

&lt;p&gt;To install all the required dependencies, run this command on the terminal of your project folder.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt; &lt;span class="nx"&gt;npm&lt;/span&gt; &lt;span class="nx"&gt;install&lt;/span&gt; &lt;span class="nx"&gt;axios&lt;/span&gt; &lt;span class="nx"&gt;fs&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once we run &lt;code&gt;npm install&lt;/code&gt; in the terminal, the command triggers the installation of the specified dependencies listed in the project's &lt;code&gt;package.json&lt;/code&gt; file. The following dependencies are commonly installed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;axios:&lt;/strong&gt; A popular HTTP client library for making HTTP requests in Node.js. It simplifies the process of sending HTTP requests and handling responses. In this case, axios is used to make a POST request to the Video Watermarking API, sending the video URL and watermark image URL.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;fs (File System)&lt;/strong&gt;: A built-in module in Node.js that provides functionalities for working with the file system. In this context, fs is used to create a write stream and save the watermarked video file. The &lt;code&gt;createWriteStream&lt;/code&gt; function allows you to write the response data from the API request directly to a file on the local file system.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Create a new file:
&lt;/h3&gt;

&lt;p&gt;The next step is to create a new file; for example, create a file &lt;code&gt;videoWatermark.js&lt;/code&gt; and add the following code to import the required libraries we installed.:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;axios&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;axios&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;fs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;fs&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Define a function to add the image watermark to the video:
&lt;/h3&gt;

&lt;p&gt;This function encapsulates the logic for making the API request to add the image watermark to the video, saving the watermarked video to a file using a write stream, and handling potential errors during the process. We will need &lt;code&gt;apytoken&lt;/code&gt; which you can find from &lt;a href="https://apyhub.com/utility/watermark-video"&gt;ApyHub Video Watermarking API documentation&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;addWatermark&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;videoURL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;watermarkImageURL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;outputFileName&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;apiURL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://api.apyhub.com/generate/video/watermark/url/file?output=${outputFileName}.mp4&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

     &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;requestData&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
       &lt;span class="na"&gt;video_url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;videoURL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
       &lt;span class="na"&gt;watermark_image_url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;watermarkImageURL&lt;/span&gt;
     &lt;span class="p"&gt;};&lt;/span&gt;

     &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
       &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;axios&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;apiURL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;requestData&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
         &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
           &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Content-Type&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;application/json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
           &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;apy-token&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;**** ADD-YOUR-SECRET-APY-TOKEN-HERE ****&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
         &lt;span class="p"&gt;},&lt;/span&gt;
         &lt;span class="na"&gt;responseType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;stream&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="c1"&gt;// To get the response as a stream&lt;/span&gt;
       &lt;span class="p"&gt;});&lt;/span&gt;

       &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;writeStream&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createWriteStream&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;${outputFileName}.mp4&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Path where the watermarked video will be saved&lt;/span&gt;
       &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pipe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;writeStream&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

       &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;reject&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
         &lt;span class="nx"&gt;writeStream&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;finish&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Resolve the promise when writing is finished&lt;/span&gt;
         &lt;span class="nx"&gt;writeStream&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;error&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;reject&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  &lt;span class="c1"&gt;// Reject the promise if an error occurs&lt;/span&gt;
       &lt;span class="p"&gt;});&lt;/span&gt;
     &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
       &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Failed to add watermark. &lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
     &lt;span class="p"&gt;}&lt;/span&gt;
   &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. Invoke the &lt;code&gt;addWatermark&lt;/code&gt; function
&lt;/h3&gt;

&lt;p&gt;After invoking the &lt;code&gt;addWatermark&lt;/code&gt; function, pass the video URL and the watermark image URL as arguments. This function sends a request to the Video Watermarking API, which adds the watermark to the video and streams the watermarked video as a response. The response is then saved to a file using a write stream.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;videoURL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;***** PROVIDE THE URL OF VIDEO *****&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;watermarkImageURL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;***** PROVIDE THE URL OF IMAGE *****&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;outputFilename&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;***** PROVIDE THE OUTPUT FILE NAME *****&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nf"&gt;addWatermark&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;videoURL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;watermarkImageURL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;outputFilename&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
     &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
       &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Watermark added successfully!&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
     &lt;span class="p"&gt;})&lt;/span&gt;
     &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;catch&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
       &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Error:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
     &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  5. Save file and execute script
&lt;/h3&gt;

&lt;p&gt;Save the file and open your terminal, navigate to the project directory, and run the following command to execute the script:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="nx"&gt;node&lt;/span&gt; &lt;span class="nx"&gt;videoWatermark&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;js&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  6. Send a request to the API
&lt;/h3&gt;

&lt;p&gt;The script will send a request to the API, download the watermarked video, and save it as provided file name  &lt;code&gt;${outputFileName}.mp4&lt;/code&gt; in your project directory. That's it! You have successfully added an image watermark to a video using Node.js.&lt;/p&gt;

&lt;p&gt;You can use the &lt;a href="https://apyhub.com/utility/watermark-video"&gt;ApyHub video watermarking tool&lt;/a&gt; to effectively watermark your video content, whether in the form of files or URLs. This utility can provide a variety of benefits, especially for businesses or individuals who want to protect their videos from unauthorized use and want to promote a brand or business.&lt;/p&gt;

&lt;p&gt;ApyHub also has similar services and tools to help &lt;a href="https://apyhub.com/utility/pdf-stamp-watermark"&gt;watermark pdfs&lt;/a&gt;, &lt;a href="https://apyhub.com/utility/pdf-stamp-watermark-footers"&gt;add footers to documents&lt;/a&gt;, and &lt;a href="https://apyhub.com/utility/image-processor-watermark"&gt;apply watermarks to images&lt;/a&gt;, which can help depending on your use case.&lt;/p&gt;

&lt;p&gt;If you’re looking to edit video content however, you can &lt;a href="https://apyhub.com/utility/convert-video"&gt;convert video formats&lt;/a&gt;, or easily &lt;a href="https://apyhub.com/utility/video-thumbnail"&gt;generate thumbnails from videos&lt;/a&gt; using ApyHub utilities.&lt;/p&gt;

</description>
      <category>node</category>
      <category>tutorial</category>
      <category>backend</category>
      <category>api</category>
    </item>
    <item>
      <title>Advanced Email Validation using ApyHub’s API in Go</title>
      <dc:creator>Sohail Pathan</dc:creator>
      <pubDate>Mon, 19 Jun 2023 12:43:46 +0000</pubDate>
      <link>https://forem.com/apyhub/advanced-email-validation-using-apyhubs-api-in-go-2peg</link>
      <guid>https://forem.com/apyhub/advanced-email-validation-using-apyhubs-api-in-go-2peg</guid>
      <description>&lt;p&gt;Email validation is a crucial aspect of ensuring data accuracy and security, but relying solely on regular expression (regex) patterns for validation is insufficient. While regex can check the syntax of an email address and accept it if it matches the pattern, it does not guarantee the authenticity or validity of the email. This limitation opens the door for fake or disposable email addresses to enter the database, posing a vulnerability to your application. Additionally, considering these fake addresses as active users adds no value.&lt;/p&gt;

&lt;p&gt;To address this problem, I have discovered a free online service provided by Apyhub that effectively solves the issue of email verification, providing a more reliable and secure solution.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apyhub.com/utility/validator-dns-email"&gt;ApyHub’s Email Validation API&lt;/a&gt; is a cloud-based API service that allows developers to easily integrate email validation functionality into their applications. This API is designed to validate email addresses in real time, providing accurate and reliable results that can help organisations reduce email bounce rates, prevent fraud, and improve their email marketing efforts.&lt;/p&gt;

&lt;h2&gt;
  
  
  How does it work?
&lt;/h2&gt;

&lt;h2&gt;
  
  
  Quick tutorial
&lt;/h2&gt;

&lt;p&gt;In this tutorial, we will be going to build an authentication app using Mongoose for storing emails in a database. While the user signup, we will check whether the email is valid or not.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Prerequisites&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;In this tutorial, we will be going to build an authentication app using Mongoose for storing emails in a database. While the user signup, we will check whether the email is valid or not.&lt;/p&gt;

&lt;p&gt;We'll need access to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://go.dev/doc/install"&gt;Go 1.1 and Above&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://apyhub.com/auth/signup"&gt;An ApyHub account&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://git-scm.com/downloads"&gt;Git CLI&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;To get started with ApyHub you first need to &lt;a href="https://apyhub.com/auth/signup"&gt;register for a free account&lt;/a&gt; to get an API Key (apy-token). You can use Google Authentication or GitHub Authentication as well.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://postimg.cc/4n0fvJvb"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Nd0F48vP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://i.postimg.cc/WbNdvzhK/image2.png" alt="image2.png" width="800" height="378"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once your signup is successful, ApyHub creates a default application with APY-TOKEN. You can find the token by navigating to &lt;strong&gt;Dashboard →  API Keys → Default Application&lt;/strong&gt; &lt;br&gt;
Eg. &lt;strong&gt;APY&lt;/strong&gt;********************************************&lt;em&gt;**CZR&lt;/em&gt;*&lt;/p&gt;

&lt;p&gt;Once the API token is generated, We will check our &lt;a href="https://apyhub.com/utility/validator-dns-email"&gt;DNS Email API&lt;/a&gt; documentatioan for integration.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://postimg.cc/f3MDWkZZ"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--JTFpW5BY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://i.postimg.cc/439d5hSK/Login-Screen.png" alt="Login-Screen.png" width="800" height="408"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Clone the project from the repository:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/iamspathan/apyhub-email-validation-tutorial-go
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or you can download the project from &lt;a href="https://github.com/iamspathan/apyhub-email-validation-tutorial.git"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Add your Secret APY-TOKEN in main.go
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;validateEmail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;email&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="s"&gt;"https://api.apyhub.com/validate/email/dns"&lt;/span&gt;

    &lt;span class="n"&gt;payload&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;Email&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="s"&gt;`json:"email"`&lt;/span&gt;
    &lt;span class="p"&gt;}{&lt;/span&gt;
        &lt;span class="n"&gt;Email&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;jsonPayload&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Marshal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="no"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NewRequest&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"POST"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bytes&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NewBuffer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;jsonPayload&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="no"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="no"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="c"&gt;// Add your apy-token here.&lt;/span&gt;

    &lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Header&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"apy-token"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"*********** ADD YOUR SECRET APY TOKEN HERE **************"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Header&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Content-Type"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"application/json"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DefaultClient&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Do&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="no"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;defer&lt;/span&gt; &lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Body&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Close&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;ioutil&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ReadAll&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Body&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="no"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;Valid&lt;/span&gt; &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="s"&gt;`json:"data"`&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Unmarshal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="no"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Valid&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Now, We can start the server for making API calls. Use this command in terminal to start the server.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;go run main.go
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Tip: The *&lt;/em&gt;&lt;code&gt;go run&lt;/code&gt;** command is used in Go to compile and run a Go program in a single step. It allows you to quickly execute a Go source file without explicitly building an executable binary.*&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Finally, Navigate to &lt;a href="http://localhost:3000"&gt;http://localhost:3000&lt;/a&gt;, You will able to see the Signup page.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://postimg.cc/wyjzLBWz"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ngb8U07x--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://i.postimg.cc/C1jKyBkR/account-signup.png" alt="account-signup.png" width="800" height="456"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Note: The authentication module mentioned in this project is provided solely as a recommendation for the project structure. While we highly encourage its use and integration according to your architecture pattern.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;We just saw, how the email validation process will only allow the verified email to create an account. But there are several use cases in which Advanced Email Validation fits.&lt;/p&gt;

&lt;h2&gt;
  
  
  What more can you solve with this?
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Bulk email verification&lt;/strong&gt;: Enterprises may have large email lists that need to be validated for accuracy and deliverability. An email validation API can be used to check the validity of each email address in the list, ensuring that emails are sent only to valid addresses.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fraud prevention&lt;/strong&gt;: Email validation APIs can also be used to detect fraudulent email addresses used in phishing attacks, preventing unauthorised access to enterprise systems.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Marketing campaigns&lt;/strong&gt;: Email validation APIs can help enterprises ensure that their marketing emails reach the intended recipients by verifying the email addresses in their lists and removing invalid addresses.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compliance&lt;/strong&gt;: Email validation APIs can help enterprises comply with data protection regulations by ensuring that emails are sent only to users who have provided valid consent.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Customer support:&lt;/strong&gt; Email validation APIs can be used to verify the email addresses of customers who submit support requests, ensuring that the enterprise is communicating with the correct customer.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;So, if you're looking to improve email deliverability, reduce bounce rates and avoid spam accounts, &lt;a href="https://apyhub.com/utility/validator-dns-email"&gt;sign up for ApyHub's email validation&lt;/a&gt; API today.&lt;/p&gt;

</description>
      <category>apyhub</category>
      <category>emailvalidation</category>
      <category>api</category>
      <category>regex</category>
    </item>
    <item>
      <title>Simple and Secure: The Benefits of Converting Word Docx to PDFs using an API</title>
      <dc:creator>Sohail Pathan</dc:creator>
      <pubDate>Sun, 21 May 2023 07:22:16 +0000</pubDate>
      <link>https://forem.com/apyhub/simple-and-secure-the-benefits-of-converting-word-docx-to-pdfs-using-an-api-1cji</link>
      <guid>https://forem.com/apyhub/simple-and-secure-the-benefits-of-converting-word-docx-to-pdfs-using-an-api-1cji</guid>
      <description>&lt;p&gt;As a developer or part of an engineering team, you have probably dealt with the need to convert and share files as part of your applications; and while there are many different formats out there, you’ve most likely needed to convert Microsoft Word docs and PDFs.&lt;/p&gt;

&lt;p&gt;Here’s why it’s a good idea to convert Word documents into PDFs before sharing:&lt;/p&gt;

&lt;h2&gt;
  
  
  Consistent Formatting
&lt;/h2&gt;

&lt;p&gt;The most important advantage of converting Word documents to PDF is consistent formatting. Word documents can look different on different devices and operating systems due to differences in fonts, margins, etc. This inconsistency can cause confusion and misinterpretation of the document’s content, which can be detrimental, especially when working on projects that require accuracy and precision.&lt;/p&gt;

&lt;p&gt;Additionally, when Word documents are opened on different devices or software, the layout and design can be altered, which can impact readability. Converting the document to PDF can ensure that the layout and design are preserved, regardless of the device or software used to view it. This can help ensure that the document’s content is easy to read and understand, regardless of the recipient’s device or software.&lt;/p&gt;

&lt;h2&gt;
  
  
  Security
&lt;/h2&gt;

&lt;p&gt;Another advantage of converting Word documents to PDF is protection against unauthorized editing and malware. PDFs can be password-protected to prevent unauthorized editing, which can be important if the document contains sensitive or confidential information. While Word documents can also be password-protected, PDFs are more widely supported and can be opened on almost any device without requiring specialized software. This added layer of protection can help ensure that the document’s content remains secure and confidential.&lt;/p&gt;

&lt;p&gt;For fully secure file sharing you can also use Secure File Archives. &lt;a href="https://apyhub.com/blog/Secure-archives-to-share-files"&gt;Read more on that here&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Compatibility
&lt;/h2&gt;

&lt;p&gt;PDFs are more compatible with a wider range of software and devices than Word documents. This is especially important if the recipient does not have Microsoft Office installed or is using a different operating system. In contrast, Word documents require the recipient to have the same or compatible software to open and edit the document. PDFs can be opened and viewed using a wide range of software, including web browsers, which makes them more accessible and easier to share.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reduced File Size
&lt;/h2&gt;

&lt;p&gt;PDFs are generally smaller in file size than Word documents, which can be important when sharing large files over the internet. This makes PDFs faster to upload and download, and can save on storage space. This is especially important when working with multiple documents, as it can be challenging to manage large files on different devices.&lt;/p&gt;

&lt;p&gt;There are several tools available to convert Word documents to PDFs. &lt;a href="https://apyhub.com/"&gt;ApyHub&lt;/a&gt; Utility APIs are a quick and easy-to-use option. ApyHub’s &lt;a href="https://apyhub.com/utility/converter-doc-pdf"&gt;File Conversion API&lt;/a&gt; allows developers to convert any file format, including Word documents to PDF, &lt;a href="https://apyhub.com/utility/converter-presentation-pdf"&gt;presentations to PDF&lt;/a&gt; with just a few lines of code. With ApyHub, developers can streamline the file &lt;a href="https://apyhub.com/search?query=&amp;amp;category=file-conversion"&gt;conversion process&lt;/a&gt; and focus on the more important aspects of their products. Some other file conversion utilities that are interesting to developers are listed &lt;a href="https://apyhub.com/search?query=&amp;amp;category=file-conversion"&gt;here&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>doctopdfapi</category>
      <category>developer</category>
      <category>scalability</category>
      <category>security</category>
    </item>
    <item>
      <title>Advanced Email Validation using ApyHub’s API in NodeJS</title>
      <dc:creator>Sohail Pathan</dc:creator>
      <pubDate>Fri, 12 May 2023 14:51:51 +0000</pubDate>
      <link>https://forem.com/apyhub/advanced-email-validation-using-apyhubs-api-in-nodejs-146c</link>
      <guid>https://forem.com/apyhub/advanced-email-validation-using-apyhubs-api-in-nodejs-146c</guid>
      <description>&lt;p&gt;Email authentication has become increasingly important in recent years for the overall security of online communication, by ensuring authenticity, and protection against email fraud, phishing and other malicious activities.&lt;/p&gt;

&lt;p&gt;Email validation can help address the issue; here are some advantages of using email validation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It can help detect syntax errors, typos, and invalid email addresses that can cause email delivery failures&lt;/li&gt;
&lt;li&gt;Network issues and over-aggressive blacklists can also result in email delivery failures, but email validation can help ensure reliable email delivery&lt;/li&gt;
&lt;li&gt;By implementing email validation, businesses can ensure that their email campaigns reach their intended recipients, improve their sender reputation, and maintain a positive brand image&lt;/li&gt;
&lt;li&gt;Additionally, email validation can help prevent potential data breaches and protect sensitive information that could be compromised through fraudulent emails&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://apyhub.com/utility/validator-dns-email"&gt;ApyHub’s Email Validation API&lt;/a&gt; is a cloud-based API service that allows developers to easily integrate email validation functionality into their applications. This API is designed to validate email addresses in real-time, providing accurate and reliable results that can help organisations reduce email bounce rates, prevent fraud, and improve their email marketing efforts.&lt;/p&gt;

&lt;h2&gt;
  
  
  How does it work?
&lt;/h2&gt;

&lt;p&gt;ApyHub Email Validation API uses a multi-step process to validate email addresses. Here is an overview of how the API works:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Syntax check:&lt;/strong&gt; The API first checks the syntax of the email address to ensure that it conforms to the standard format. This includes checking for missing "@" or "." symbols and ensuring that the address does not contain any invalid characters.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Standard Response:&lt;/strong&gt; The API is a RESTful API that delivers data in JSON format.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Domain verification&lt;/strong&gt;: The API then verifies the email address domain by checking its DNS records. This helps ensure that the domain is valid and active and can receive email. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Spam trap and disposable email check:&lt;/strong&gt; Finally, the API checks the email address against known spam traps and disposable email address providers. This helps prevent fraudulent or invalid email addresses from being used. This list gets updated from a wide variety of sources daily basis to make sure you get the most up-to-date and accurate information to protect your system from potential threats related to spam and fraud.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;(Looking for other ways to ensure security for your website or application? &lt;a href="https://apyhub.com/blog/Secure-archives-to-share-files"&gt;Here’s why and how you can use Secure Archives to share files&lt;/a&gt;)&lt;/p&gt;

&lt;h2&gt;
  
  
  Quick tutorial
&lt;/h2&gt;

&lt;p&gt;In this tutorial, we will be going to build an authentication app using Mongoose for storing emails in a database. While the user signup, we will check whether the email is valid or not.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Prerequisites&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Node.js v16+&lt;/li&gt;
&lt;li&gt;An ApyHub account&lt;/li&gt;
&lt;li&gt;Git CLI&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;To get started with ApyHub you first need to register for a free account to get an API Key (apy-token). You can use Google Authentication or GitHub Authentication as well.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--cjMv3FNJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://i.postimg.cc/DZ7fYHvP/auth.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--cjMv3FNJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://i.postimg.cc/DZ7fYHvP/auth.png" alt="auth.png" width="800" height="378"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once your signup is successful, ApyHub creates a default application with APY-TOKEN. You can find the token by navigating to &lt;strong&gt;Dashboard →  API Keys → Default Application&lt;/strong&gt; &lt;br&gt;
Eg. &lt;strong&gt;APY&lt;/strong&gt;********************************************&lt;em&gt;**CZR&lt;/em&gt;*&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Clone the starter project from the repository:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/iamspathan/apyhub-email-validation-tutorial.git
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Install dependencies
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Add your Secret APY-TOKEN in server.js
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/signup&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;password&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="c1"&gt;//validate email using ApyHub API&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;axios&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://api.apyhub.com/validate/email/dns&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;email&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;apy-token&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ADD-YOUR-APY-TOKEN-HERE&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Content-Type&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;application/json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;

    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;400&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="na"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Invalid email address&lt;/span&gt;&lt;span class="dl"&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;// Check if user already exists&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;u&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;u&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;email&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;409&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="na"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;User already exists&lt;/span&gt;&lt;span class="dl"&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;// Hash password&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;saltRounds&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;hashedPassword&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;bcrypt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;hash&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;password&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;saltRounds&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// Save user&lt;/span&gt;
    &lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;password&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;hashedPassword&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;201&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="na"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;User created&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;500&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="na"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Internal server error&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Start the app
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;node server.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Finally, Navigate to &lt;a href="http://localhost:3000"&gt;http://localhost:3000&lt;/a&gt;, You will able to see the Signup page.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--O6ve_yID--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://i.postimg.cc/HnCN21TT/account-signup.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--O6ve_yID--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://i.postimg.cc/HnCN21TT/account-signup.png" alt="account-signup.png" width="800" height="456"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Note: The authentication module mentioned in this project is provided solely as a recommendation for the project structure. While we highly encourage its use and integration according to your architecture pattern.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Use Cases:
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Bulk email verification&lt;/strong&gt;: Enterprises may have large email lists that need to be validated for accuracy and deliverability. An email validation API can be used to check the validity of each email address in the list, ensuring that emails are sent only to valid addresses.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fraud prevention&lt;/strong&gt;: Email validation APIs can also be used to detect fraudulent email addresses used in phishing attacks, preventing unauthorised access to enterprise systems.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Marketing campaigns&lt;/strong&gt;: Email validation APIs can help enterprises ensure that their marketing emails reach the intended recipients by verifying the email addresses in their lists and removing invalid addresses.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compliance&lt;/strong&gt;: Email validation APIs can help enterprises comply with data protection regulations by ensuring that emails are sent only to users who have provided valid consent.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Customer support:&lt;/strong&gt; Email validation APIs can be used to verify the email addresses of customers who submit support requests, ensuring that the enterprise is communicating with the correct customer.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;So, if you're looking to improve email deliverability, reduce bounce rates and avoid spam accounts, &lt;a href="https://apyhub.com/utility/validator-dns-email"&gt;sign up for ApyHub's email validation&lt;/a&gt; API today.&lt;/p&gt;

</description>
      <category>oauth</category>
      <category>applicationsecurity</category>
      <category>webdev</category>
      <category>node</category>
    </item>
    <item>
      <title>How to build a Next.js app with ApyHub</title>
      <dc:creator>Edy Musajevs</dc:creator>
      <pubDate>Fri, 10 Feb 2023 13:50:22 +0000</pubDate>
      <link>https://forem.com/apyhub/how-to-build-a-nextjs-app-with-apyhub-1nif</link>
      <guid>https://forem.com/apyhub/how-to-build-a-nextjs-app-with-apyhub-1nif</guid>
      <description>&lt;p&gt;This tutorial will guide you through the steps of setting up a Next.js app and integrating it with ApyHub. We will use the timezone API and the iCal API from ApyHub.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Prerequisites&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Basic knowledge of Next.js and Typescript&lt;/li&gt;
&lt;li&gt;Node.js v16+&lt;/li&gt;
&lt;li&gt;An ApyHub account&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Setting up the Next.js Project&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Open your terminal and navigate to the directory where you want to set up your project.&lt;/p&gt;

&lt;p&gt;Clone the Next.js starter project from the repository:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git clone -b starter https://github.com/apyhub/with-nextjs.git
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Navigate into the newly created directory:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd with-nextjs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Install the dependencies:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Start the app:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm run dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your app should now be running and look similar to this screenshot:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--_zbmBToN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://assets.apyhub.com/images/with-next-js/1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--_zbmBToN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://assets.apyhub.com/images/with-next-js/1.png" alt="https://assets.apyhub.com/images/with-next-js/1.png" width="880" height="551"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Set up your ApyHub account
&lt;/h2&gt;

&lt;p&gt;Go to &lt;strong&gt;&lt;a href="https://apyhub.com/auth/signup"&gt;https://apyhub.com/auth/signup&lt;/a&gt;&lt;/strong&gt; and log in to your ApyHub account.&lt;/p&gt;

&lt;p&gt;Once logged in, access the timezone API and the iCal generator API:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://apyhub.com/utility/data-lists-timezone"&gt;https://apyhub.com/utility/data-lists-timezone&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://apyhub.com/utility/generator-ical"&gt;https://apyhub.com/utility/generator-ical&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To be able to communicate with the APIs from your Next.js app, you will need an &lt;strong&gt;&lt;code&gt;apy-token&lt;/code&gt;&lt;/strong&gt; environment variable. To get this token, follow these steps:&lt;/p&gt;

&lt;p&gt;On the API documentation page, click on the yellow "Create App" button in the top right corner.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--lrxUwvIE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://assets.apyhub.com/images/with-next-js/2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--lrxUwvIE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://assets.apyhub.com/images/with-next-js/2.png" alt="https://assets.apyhub.com/images/with-next-js/2.png" width="880" height="501"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Create a new token with the name &lt;code&gt;with-nextjs&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--oyM5etP9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://assets.apyhub.com/images/with-next-js/3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--oyM5etP9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://assets.apyhub.com/images/with-next-js/3.png" alt="https://assets.apyhub.com/images/with-next-js/3.png" width="880" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After creating the token, you can view it on the &lt;code&gt;My Apps&lt;/code&gt; page. Copy the token and store it securely. We will use it in the following steps of our Next.js project.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--rDeds04P--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://assets.apyhub.com/images/with-next-js/4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--rDeds04P--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://assets.apyhub.com/images/with-next-js/4.png" alt="https://assets.apyhub.com/images/with-next-js/4.png" width="880" height="503"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Integrate ApyHub with a Next.js project
&lt;/h2&gt;

&lt;p&gt;Install the &lt;a href="https://github.com/apyhub/apyhub.js"&gt;apyhub.js&lt;/a&gt; Node.js library in your &lt;code&gt;with-nextjs&lt;/code&gt; project.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="nx"&gt;npm&lt;/span&gt; &lt;span class="nx"&gt;install&lt;/span&gt; &lt;span class="nx"&gt;apyhub&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Create a new &lt;code&gt;.env&lt;/code&gt; file in the root of your project and name it &lt;code&gt;.env.local&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Inside this file, add the app token created in the previous step, like so:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="nx"&gt;APY_TOKEN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nx"&gt;YOUR_APP_TOKEN_GOES_HERE&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Create a new folder called &lt;code&gt;lib&lt;/code&gt; to initialize the ApyHub library. &lt;/p&gt;

&lt;p&gt;Inside that folder create a new file called &lt;code&gt;apyhub.ts&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;In this file, we will initialize the Apyhub client using the environment variable token created previously:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;initApyhub&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;apyhub&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;apy&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;initApyhub&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;APY_TOKEN&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;apy&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  How to use ApyHub API utilities
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Fetching timezones
&lt;/h3&gt;

&lt;p&gt;Currently, our user interface (UI) has an empty dropdown menu for time zones. To avoid having to manually create the array ourselves, it would be beneficial to display all time zones in this menu. Fortunately, we can use the &lt;a href="https://apyhub.com/utility/data-lists-timezone"&gt;data-lists-timezone&lt;/a&gt; API for this purpose.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--7KVGnUJ_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://assets.apyhub.com/images/with-next-js/5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--7KVGnUJ_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://assets.apyhub.com/images/with-next-js/5.png" alt="https://assets.apyhub.com/images/with-next-js/5.png" width="880" height="469"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;ApyHub does not support client-side requests due to the security risk of exposing credentials to the client, which could lead to malicious actors making requests on your behalf. If you attempt to make a client-side API request, you will receive a CORS error. To ensure all API requests are handled from the server, Next.js serves as the bridge between the frontend and backend.&lt;/p&gt;

&lt;p&gt;Inside the &lt;code&gt;/pages/index.tsx&lt;/code&gt; file of your Next.js project, there is a &lt;a href="https://nextjs.org/docs/basic-features/data-fetching/get-server-side-props"&gt;getServerSideProps&lt;/a&gt; function. This is where server-side code is executed for Next.js projects.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--wW7bD0Gv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://assets.apyhub.com/images/with-next-js/6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--wW7bD0Gv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://assets.apyhub.com/images/with-next-js/6.png" alt="https://assets.apyhub.com/images/with-next-js/6.png" width="854" height="348"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In here, we currently return an empty array for timezones. Let's change that by fetching an array of timezones from ApyHub. First, import and export the &lt;code&gt;data&lt;/code&gt; object inside the &lt;code&gt;lib/apyhub.ts&lt;/code&gt; file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;initApyhub&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;apyhub&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;apy&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;initApyhub&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;APY_TOKEN&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;apy&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use &lt;code&gt;getServerSideProps&lt;/code&gt; in the &lt;code&gt;/pages/index.tsx&lt;/code&gt; file to fetch data.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;../lib/apyhub&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;getServerSideProps&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;timezones&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;timezones&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;props&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;timezones&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Reload the page to see all timezones in the dropdown menu - great!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--GdpW8d_V--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://assets.apyhub.com/images/with-next-js/7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--GdpW8d_V--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://assets.apyhub.com/images/with-next-js/7.png" alt="https://assets.apyhub.com/images/with-next-js/7.png" width="880" height="506"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Fetching iCal file
&lt;/h3&gt;

&lt;p&gt;Now that we can select a time zone from our drop-down, we have all the necessary components to generate a new iCal event. Next, we will create the API request to make this happen. To do this, we will use &lt;a href="https://nextjs.org/docs/api-routes/introduction"&gt;Next.js API routes&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Create a new API route. Inside the &lt;code&gt;/pages&lt;/code&gt; folder, create a new folder called &lt;code&gt;api&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Inside the &lt;code&gt;/pages/api&lt;/code&gt; folder, create a new file called &lt;code&gt;ical.ts&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;We will use the &lt;code&gt;generate&lt;/code&gt; object from the apyhub library to create a new iCal file.&lt;/p&gt;

&lt;p&gt;Go to the &lt;code&gt;/lib/apyhub.ts&lt;/code&gt; file and add the &lt;code&gt;generate&lt;/code&gt; object, then export it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;initApyhub&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;generate&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;apyhub&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;apy&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;initApyhub&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;APY_TOKEN&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;apy&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;generate&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Inside the &lt;code&gt;/pages/api/ical.ts&lt;/code&gt; file, create a new handler function. Pass the incoming request body data to the &lt;code&gt;generate.ical()&lt;/code&gt; function:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;generate&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;../../lib/apyhub&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;NextApiRequest&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;NextApiResponse&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;next&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;handler&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;NextApiRequest&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;NextApiResponse&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;summary&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;description&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;organizer_email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;attendees_emails&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;location&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;timezone&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;start_time&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;end_time&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;meeting_date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;recurring&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;recurrence&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;generate&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ical&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="nx"&gt;summary&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;description&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;organizerEmail&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;organizer_email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;attendeesEmails&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;attendees_emails&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;location&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;timeZone&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;timezone&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;startTime&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;start_time&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;endTime&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;end_time&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;meetingDate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;meeting_date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;recurring&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;recurrence&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;responseFormat&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;url&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;json&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;handler&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We've finished! We can now generate an ical file with the given data and download it from our app. No more hassle! &lt;/p&gt;

&lt;p&gt;To test it out, fill out the form in our app and click &lt;code&gt;Create Event&lt;/code&gt;. The browser then makes a request to the &lt;code&gt;/api/ical.ts&lt;/code&gt; API endpoint, which sends a request to ApyHub servers to create a new iCal file. We receive an URL pointing to this file, which we return to the browser. The file is then downloaded with &lt;code&gt;window.open(data, "_blank");&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Deployment
&lt;/h2&gt;

&lt;p&gt;Now that our app is complete, we can easily deploy it on Vercel. Follow &lt;a href="https://nextjs.org/learn/basics/deploying-nextjs-app/deploy"&gt;these steps&lt;/a&gt; and make sure to add the &lt;code&gt;APY_TOKEN&lt;/code&gt; as an environment variable when deploying the application.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--TMpldic7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://assets.apyhub.com/images/with-next-js/8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--TMpldic7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://assets.apyhub.com/images/with-next-js/8.png" alt="https://assets.apyhub.com/images/with-next-js/8.png" width="880" height="719"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Bonus
&lt;/h2&gt;

&lt;p&gt;Currently, there is no way to validate if an organizer or attendee email provided on our app has a valid domain. To ensure accuracy, you can add the &lt;a href="https://apyhub.com/utility/validator-dns-email"&gt;validator-dns-email&lt;/a&gt; API to the &lt;code&gt;/api/ical.ts&lt;/code&gt; API route before creating the iCal file. This will validate if the submitted email is valid.&lt;/p&gt;

</description>
      <category>tutorial</category>
      <category>nextjs</category>
      <category>api</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Easily generate charts &amp; graphs with these APIs</title>
      <dc:creator>Maria Hayat</dc:creator>
      <pubDate>Tue, 06 Dec 2022 12:13:36 +0000</pubDate>
      <link>https://forem.com/apyhub/easily-generate-charts-graphs-with-these-apis-2b86</link>
      <guid>https://forem.com/apyhub/easily-generate-charts-graphs-with-these-apis-2b86</guid>
      <description>&lt;p&gt;Generate beautiful charts - bar graph, pie charts or stack graphs - using ApyHub's simplified APIs. You can easily embed these charts in your applications or documents. &lt;/p&gt;

&lt;p&gt;Plus you have the option to generate the charts in  dark or light mode. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://apyhub.com/search?query=&amp;amp;tags=charts" rel="noopener noreferrer"&gt;Give it a try!&lt;/a&gt; &lt;/p&gt;

</description>
      <category>php</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Accelerate your development projects with ApyHub</title>
      <dc:creator>Maria Hayat</dc:creator>
      <pubDate>Mon, 10 Oct 2022 11:00:30 +0000</pubDate>
      <link>https://forem.com/apyhub/accelerate-your-development-projects-with-apyhub-3fnm</link>
      <guid>https://forem.com/apyhub/accelerate-your-development-projects-with-apyhub-3fnm</guid>
      <description>&lt;p&gt;We have been working on improving our platform to help developers who are tired of lengthy development cycles, multiple library integrations and bloated applications.&lt;/p&gt;

&lt;p&gt;Say hello to ApyHub! &lt;a href="https://apyhub.com/"&gt;ApyHub.com&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;We offer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;An ever-growing expansive list of software utility services&lt;/li&gt;
&lt;li&gt;A single subscription (for all your software utility needs)&lt;/li&gt;
&lt;li&gt;Simplified Integrations&lt;/li&gt;
&lt;li&gt;Easy Compliance&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Try now, it’s free! &lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>devops</category>
      <category>api</category>
    </item>
  </channel>
</rss>
