<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Den N</title>
    <description>The latest articles on DEV Community by Den N (@deneiz).</description>
    <link>https://dev.to/deneiz</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3977923%2F1f8cf1ef-9c05-43af-bde6-1ddd6a4de15c.jpg</url>
      <title>DEV Community: Den N</title>
      <link>https://dev.to/deneiz</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/deneiz"/>
    <language>en</language>
    <item>
      <title>Creating Short Links with PHP: A Practical Guide</title>
      <dc:creator>Den N</dc:creator>
      <pubDate>Thu, 25 Jun 2026 18:33:43 +0000</pubDate>
      <link>https://dev.to/deneiz/creating-short-links-with-php-a-practical-guide-5blm</link>
      <guid>https://dev.to/deneiz/creating-short-links-with-php-a-practical-guide-5blm</guid>
      <description>&lt;h1&gt;
  
  
  Creating Short Links with PHP: A Practical Guide
&lt;/h1&gt;

&lt;p&gt;URL shorteners are everywhere.&lt;/p&gt;

&lt;p&gt;They're used in marketing campaigns, email newsletters, QR codes, social media posts, affiliate links, and analytics platforms.&lt;/p&gt;

&lt;p&gt;While most developers are familiar with services like Bitly, integrating a URL shortener directly into your application is often much more useful.&lt;/p&gt;

&lt;p&gt;In this article, we'll build short links from PHP using an API.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Create Short Links Programmatically?
&lt;/h2&gt;

&lt;p&gt;Creating links through a dashboard works for occasional usage.&lt;/p&gt;

&lt;p&gt;But applications often need to generate links automatically.&lt;/p&gt;

&lt;p&gt;Common examples include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Email campaigns&lt;/li&gt;
&lt;li&gt;User invitations&lt;/li&gt;
&lt;li&gt;Affiliate systems&lt;/li&gt;
&lt;li&gt;QR code generation&lt;/li&gt;
&lt;li&gt;Marketing automation&lt;/li&gt;
&lt;li&gt;Analytics tracking&lt;/li&gt;
&lt;li&gt;Customer portals&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;An API allows applications to create and manage links without human interaction.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Traditional HTTP Approach
&lt;/h2&gt;

&lt;p&gt;Most URL shortener APIs work through simple HTTP requests.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$client&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;GuzzleHttp\Client&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nv"&gt;$response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$client&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s1"&gt;'https://example.com/api/links'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="s1"&gt;'headers'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="s1"&gt;'X-Api-Key'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$apiKey&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'Content-Type'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'application/json'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="s1"&gt;'json'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="s1"&gt;'url'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'https://example.com/article'&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="nv"&gt;$data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;json_decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nv"&gt;$response&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getBody&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
    &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'short_url'&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This works.&lt;/p&gt;

&lt;p&gt;But once your application creates dozens or hundreds of links, the amount of boilerplate code starts growing.&lt;/p&gt;




&lt;h2&gt;
  
  
  Using a PHP SDK
&lt;/h2&gt;

&lt;p&gt;A PHP SDK removes most of the repetitive work.&lt;/p&gt;

&lt;p&gt;Installation is usually straightforward:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt; composer require lix-url/php-sdk
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Creating a link becomes much simpler:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$link&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$client&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;links&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
    &lt;span class="s1"&gt;'url'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'https://example.com/article'&lt;/span&gt;
&lt;span class="p"&gt;]);&lt;/span&gt;

&lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$link&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;shortUrl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The SDK handles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Authentication&lt;/li&gt;
&lt;li&gt;HTTP requests&lt;/li&gt;
&lt;li&gt;Response parsing&lt;/li&gt;
&lt;li&gt;Error handling&lt;/li&gt;
&lt;li&gt;DTO mapping&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This allows your application code to remain clean.&lt;/p&gt;




&lt;h2&gt;
  
  
  Creating Your First Short Link
&lt;/h2&gt;

&lt;p&gt;Let's imagine an application that sends invitation emails.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$inviteLink&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$client&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;links&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
    &lt;span class="s1"&gt;'url'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'https://myapp.com/invite/abc123'&lt;/span&gt;
&lt;span class="p"&gt;]);&lt;/span&gt;

&lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$inviteLink&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;shortUrl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The resulting link can then be inserted into emails or notifications.&lt;/p&gt;




&lt;h2&gt;
  
  
  Organizing Links into Groups
&lt;/h2&gt;

&lt;p&gt;As applications grow, links often need to be organized.&lt;/p&gt;

&lt;p&gt;Examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Marketing campaigns&lt;/li&gt;
&lt;li&gt;Customers&lt;/li&gt;
&lt;li&gt;Teams&lt;/li&gt;
&lt;li&gt;Projects&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Many APIs support groups:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$group&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$client&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;groups&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
    &lt;span class="s1"&gt;'name'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'Summer Campaign'&lt;/span&gt;
&lt;span class="p"&gt;]);&lt;/span&gt;

&lt;span class="nv"&gt;$link&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$client&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;links&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
    &lt;span class="s1"&gt;'url'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'https://example.com'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'group_id'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$group&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;
&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Grouping links makes reporting and analytics much easier.&lt;/p&gt;




&lt;h2&gt;
  
  
  Error Handling
&lt;/h2&gt;

&lt;p&gt;Network requests can fail.&lt;/p&gt;

&lt;p&gt;APIs can return validation errors.&lt;/p&gt;

&lt;p&gt;Authentication tokens may expire.&lt;/p&gt;

&lt;p&gt;Always handle exceptions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;$link&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$client&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;links&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
        &lt;span class="s1"&gt;'url'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&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;catch&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;ApiException&lt;/span&gt; &lt;span class="nv"&gt;$e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$e&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getMessage&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;Centralized exception handling keeps applications stable.&lt;/p&gt;




&lt;h2&gt;
  
  
  Tracking Link Performance
&lt;/h2&gt;

&lt;p&gt;One major advantage of URL shorteners is analytics.&lt;/p&gt;

&lt;p&gt;Applications can measure:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Click counts&lt;/li&gt;
&lt;li&gt;Campaign performance&lt;/li&gt;
&lt;li&gt;User engagement&lt;/li&gt;
&lt;li&gt;Traffic sources&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This information can help teams understand which content performs best.&lt;/p&gt;




&lt;h2&gt;
  
  
  Example: Creating a Link with Lix.li
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://lix.li/url-shortener-api" rel="noopener noreferrer"&gt;Lix.li&lt;/a&gt; provides a public REST API for link management and analytics.&lt;/p&gt;

&lt;p&gt;The API allows developers to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create links&lt;/li&gt;
&lt;li&gt;Update links&lt;/li&gt;
&lt;li&gt;Organize links into groups&lt;/li&gt;
&lt;li&gt;Access analytics data&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;API documentation:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://lix.li/api" rel="noopener noreferrer"&gt;https://lix.li/api&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The official PHP SDK can be installed with Composer:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;composer require lix-url/php-sdk
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Basic usage:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;Lix\Client&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nv"&gt;$client&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;Client&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'lix_live_your_key'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nv"&gt;$link&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$client&lt;/span&gt;
    &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;links&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
        &lt;span class="s1"&gt;'url'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'https://example.com'&lt;/span&gt;
    &lt;span class="p"&gt;]);&lt;/span&gt;

&lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$link&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;shortUrl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The SDK provides:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Typed DTOs&lt;/li&gt;
&lt;li&gt;Resource classes&lt;/li&gt;
&lt;li&gt;Custom exceptions&lt;/li&gt;
&lt;li&gt;PSR-compatible HTTP support&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Repository:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/lix-url/php-sdk" rel="noopener noreferrer"&gt;https://github.com/lix-url/php-sdk&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  When Should You Use a URL Shortener API?
&lt;/h2&gt;

&lt;p&gt;A URL shortener API becomes useful when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Your application sends emails.&lt;/li&gt;
&lt;li&gt;You track campaigns.&lt;/li&gt;
&lt;li&gt;You generate QR codes.&lt;/li&gt;
&lt;li&gt;You build marketing tools.&lt;/li&gt;
&lt;li&gt;You create customer portals.&lt;/li&gt;
&lt;li&gt;You need click analytics.&lt;/li&gt;
&lt;li&gt;You want centralized link management.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Even relatively small applications often benefit from automating link creation.&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Creating short links from PHP is surprisingly simple.&lt;/p&gt;

&lt;p&gt;You can work directly with HTTP requests, but SDKs usually provide a much better developer experience.&lt;/p&gt;

&lt;p&gt;By abstracting authentication, requests, and responses, SDKs allow developers to focus on application logic instead of API plumbing.&lt;/p&gt;

&lt;p&gt;If your application generates links regularly, integrating a URL shortener API can save time, improve analytics, and simplify link management.&lt;/p&gt;

</description>
      <category>php</category>
      <category>api</category>
      <category>webdev</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>How a PHP SDK Can Save You Hundreds of Lines of API Integration Code</title>
      <dc:creator>Den N</dc:creator>
      <pubDate>Sat, 13 Jun 2026 15:47:53 +0000</pubDate>
      <link>https://dev.to/deneiz/how-a-php-sdk-can-save-you-hundreds-of-lines-of-api-integration-code-5e87</link>
      <guid>https://dev.to/deneiz/how-a-php-sdk-can-save-you-hundreds-of-lines-of-api-integration-code-5e87</guid>
      <description>&lt;h1&gt;
  
  
  How a PHP SDK Can Save You Hundreds of Lines of API Integration Code
&lt;/h1&gt;

&lt;p&gt;Most APIs provide documentation, examples, and maybe even a Postman collection.&lt;/p&gt;

&lt;p&gt;That's usually enough to get started.&lt;/p&gt;

&lt;p&gt;But once your application grows, you'll quickly discover that working directly with HTTP requests introduces a surprising amount of repetitive code.&lt;/p&gt;

&lt;p&gt;You end up writing the same things over and over:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Authentication headers&lt;/li&gt;
&lt;li&gt;Request serialization&lt;/li&gt;
&lt;li&gt;Response parsing&lt;/li&gt;
&lt;li&gt;Error handling&lt;/li&gt;
&lt;li&gt;Pagination logic&lt;/li&gt;
&lt;li&gt;DTO mapping&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is exactly why SDKs exist.&lt;/p&gt;

&lt;p&gt;In this article, we'll look at how a PHP SDK can simplify API integrations and reduce maintenance costs over time.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Hidden Cost of Direct API Calls
&lt;/h2&gt;

&lt;p&gt;Let's imagine you're integrating a URL shortening API.&lt;/p&gt;

&lt;p&gt;A typical implementation might look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$client&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;GuzzleHttp\Client&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nv"&gt;$response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$client&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s1"&gt;'https://example.com/api/links'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="s1"&gt;'headers'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="s1"&gt;'X-Api-Key'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$apiKey&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'Content-Type'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'application/json'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="s1"&gt;'json'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="s1"&gt;'url'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'https://example.com'&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="nv"&gt;$data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;json_decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nv"&gt;$response&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getBody&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getContents&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
    &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This doesn't seem bad.&lt;/p&gt;

&lt;p&gt;Now repeat it for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create link&lt;/li&gt;
&lt;li&gt;Update link&lt;/li&gt;
&lt;li&gt;Delete link&lt;/li&gt;
&lt;li&gt;Get link&lt;/li&gt;
&lt;li&gt;List links&lt;/li&gt;
&lt;li&gt;Create group&lt;/li&gt;
&lt;li&gt;Update group&lt;/li&gt;
&lt;li&gt;Get profile&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Eventually your codebase becomes filled with API boilerplate.&lt;/p&gt;

&lt;p&gt;The business logic becomes harder to see because it's buried under HTTP implementation details.&lt;/p&gt;




&lt;h2&gt;
  
  
  What a Good SDK Does
&lt;/h2&gt;

&lt;p&gt;A well-designed SDK abstracts repetitive tasks and exposes a clean programming interface.&lt;/p&gt;

&lt;p&gt;Instead of dealing with HTTP requests directly, developers work with resources and objects.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$link&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$client&lt;/span&gt;
    &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;links&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
        &lt;span class="s1"&gt;'url'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'https://example.com'&lt;/span&gt;
    &lt;span class="p"&gt;]);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is easier to read and easier to maintain.&lt;/p&gt;

&lt;p&gt;The SDK becomes responsible for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Authentication&lt;/li&gt;
&lt;li&gt;Request building&lt;/li&gt;
&lt;li&gt;Validation&lt;/li&gt;
&lt;li&gt;Serialization&lt;/li&gt;
&lt;li&gt;Response mapping&lt;/li&gt;
&lt;li&gt;Exception handling&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Consistent Error Handling
&lt;/h2&gt;

&lt;p&gt;One common problem with raw API integrations is inconsistent error handling.&lt;/p&gt;

&lt;p&gt;Without an SDK, every request may need its own validation logic:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;$response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$client&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&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="nc"&gt;\Throwable&lt;/span&gt; &lt;span class="nv"&gt;$e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Handle exception&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A good SDK provides a consistent exception hierarchy.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;$link&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$client&lt;/span&gt;
        &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;links&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
            &lt;span class="s1"&gt;'url'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&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;catch&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;ApiException&lt;/span&gt; &lt;span class="nv"&gt;$e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$e&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getMessage&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;Now all API-related errors behave predictably.&lt;/p&gt;




&lt;h2&gt;
  
  
  Strongly Typed Responses
&lt;/h2&gt;

&lt;p&gt;Associative arrays are flexible.&lt;/p&gt;

&lt;p&gt;They're also easy to misuse.&lt;/p&gt;

&lt;p&gt;Consider:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'short_url'&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What happens if the API changes?&lt;/p&gt;

&lt;p&gt;What if the key doesn't exist?&lt;/p&gt;

&lt;p&gt;Strongly typed DTOs make integrations safer:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$link&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;shortUrl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$link&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;clicks&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$link&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;createdAt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Modern IDEs can now provide:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Autocomplete&lt;/li&gt;
&lt;li&gt;Static analysis&lt;/li&gt;
&lt;li&gt;Type checking&lt;/li&gt;
&lt;li&gt;Refactoring support&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This significantly improves developer experience.&lt;/p&gt;




&lt;h2&gt;
  
  
  Easier Maintenance
&lt;/h2&gt;

&lt;p&gt;API changes happen.&lt;/p&gt;

&lt;p&gt;Endpoints evolve.&lt;/p&gt;

&lt;p&gt;New fields appear.&lt;/p&gt;

&lt;p&gt;Authentication methods change.&lt;/p&gt;

&lt;p&gt;When every API request is scattered throughout an application, updating integrations becomes painful.&lt;/p&gt;

&lt;p&gt;With an SDK, the integration layer is centralized.&lt;/p&gt;

&lt;p&gt;The SDK maintainers handle compatibility changes, while application code remains largely unchanged.&lt;/p&gt;

&lt;p&gt;This separation dramatically reduces maintenance effort.&lt;/p&gt;




&lt;h2&gt;
  
  
  Better Discoverability
&lt;/h2&gt;

&lt;p&gt;One underrated benefit of SDKs is discoverability.&lt;/p&gt;

&lt;p&gt;Developers can often understand available features without opening documentation.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$client&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;profile&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nv"&gt;$client&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;links&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nv"&gt;$client&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;groups&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The API structure becomes self-documenting.&lt;/p&gt;

&lt;p&gt;This is particularly valuable for larger APIs with dozens of endpoints.&lt;/p&gt;




&lt;h2&gt;
  
  
  SDKs and OpenAPI
&lt;/h2&gt;

&lt;p&gt;Many modern SDKs are built around OpenAPI specifications.&lt;/p&gt;

&lt;p&gt;This creates several advantages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Consistent documentation&lt;/li&gt;
&lt;li&gt;Easier client generation&lt;/li&gt;
&lt;li&gt;Better testing&lt;/li&gt;
&lt;li&gt;Improved API governance&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When an API has a public OpenAPI specification, developers gain a clear contract describing available endpoints, request formats, and response structures.&lt;/p&gt;

&lt;p&gt;This helps SDKs remain accurate as APIs evolve.&lt;/p&gt;




&lt;h2&gt;
  
  
  A Real-World Example
&lt;/h2&gt;

&lt;p&gt;One project that follows this approach is Lix.li, a URL shortener and link analytics platform.&lt;/p&gt;

&lt;p&gt;The project maintains:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A public REST API&lt;/li&gt;
&lt;li&gt;An OpenAPI specification&lt;/li&gt;
&lt;li&gt;Official SDKs for multiple languages&lt;/li&gt;
&lt;li&gt;A dedicated PHP SDK&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The PHP SDK uses:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Typed resources&lt;/li&gt;
&lt;li&gt;DTO-based responses&lt;/li&gt;
&lt;li&gt;Custom exceptions&lt;/li&gt;
&lt;li&gt;PSR-compatible HTTP clients&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can explore the API here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://lix.li/api" rel="noopener noreferrer"&gt;https://lix.li/api&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;About API documentation here:&lt;br&gt;
&lt;a href="https://lix.li/url-shortener-api" rel="noopener noreferrer"&gt;https://lix.li/url-shortener-api&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;About PHP SDK here:&lt;br&gt;
&lt;a href="https://lix.li/php-sdk" rel="noopener noreferrer"&gt;https://lix.li/php-sdk&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And the PHP SDK repository here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/lix-url/php-sdk" rel="noopener noreferrer"&gt;https://github.com/lix-url/php-sdk&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Even if you're building your own API platform, it's worth studying how modern SDKs structure resources, models, and error handling.&lt;/p&gt;




&lt;h2&gt;
  
  
  When Should You Build an SDK?
&lt;/h2&gt;

&lt;p&gt;If your API is used by more than a few developers, the answer is usually:&lt;/p&gt;

&lt;p&gt;Sooner than you think.&lt;/p&gt;

&lt;p&gt;SDKs become especially valuable when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The API has multiple endpoints&lt;/li&gt;
&lt;li&gt;Authentication is required&lt;/li&gt;
&lt;li&gt;Complex payloads are involved&lt;/li&gt;
&lt;li&gt;Third-party developers use the API&lt;/li&gt;
&lt;li&gt;Long-term maintenance matters&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The larger the API becomes, the more value an SDK provides.&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Developers often focus on API design while overlooking developer experience.&lt;/p&gt;

&lt;p&gt;But a well-designed SDK is frequently what determines whether an API feels pleasant or frustrating to use.&lt;/p&gt;

&lt;p&gt;By removing repetitive HTTP code, providing typed objects, and standardizing error handling, SDKs allow developers to focus on solving business problems rather than managing infrastructure details.&lt;/p&gt;

&lt;p&gt;Whether you're consuming APIs or building them, investing in a good SDK is almost always worth the effort.&lt;/p&gt;

</description>
      <category>php</category>
      <category>api</category>
      <category>sdk</category>
      <category>webdev</category>
    </item>
    <item>
      <title>How SDKs can save you hours when working with URL Shortening APIs</title>
      <dc:creator>Den N</dc:creator>
      <pubDate>Wed, 10 Jun 2026 15:04:12 +0000</pubDate>
      <link>https://dev.to/deneiz/how-sdks-can-save-you-hours-when-working-with-url-shortening-apis-1mca</link>
      <guid>https://dev.to/deneiz/how-sdks-can-save-you-hours-when-working-with-url-shortening-apis-1mca</guid>
      <description>&lt;p&gt;When developers integrate a URL shortening service, they often start with direct HTTP requests.&lt;/p&gt;

&lt;p&gt;At first glance it seems simple enough:&lt;br&gt;
&lt;/p&gt;

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

&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://example.com/api/links&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;X-Api-Key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;your_api_key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://example.com&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;However, as the integration grows, things become more complicated.&lt;/p&gt;

&lt;p&gt;You need to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Handle authentication&lt;/li&gt;
&lt;li&gt;Process API errors&lt;/li&gt;
&lt;li&gt;Validate responses&lt;/li&gt;
&lt;li&gt;Work with pagination&lt;/li&gt;
&lt;li&gt;Maintain DTOs and models&lt;/li&gt;
&lt;li&gt;Keep up with API changes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is where SDKs become valuable.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem With Raw API Calls
&lt;/h2&gt;

&lt;p&gt;Let's say you need to create links, manage groups, retrieve analytics and work with user profiles.&lt;/p&gt;

&lt;p&gt;Without an SDK, every operation requires:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Building requests&lt;/li&gt;
&lt;li&gt;Parsing JSON&lt;/li&gt;
&lt;li&gt;Handling exceptions&lt;/li&gt;
&lt;li&gt;Maintaining boilerplate code&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This quickly becomes repetitive.&lt;/p&gt;

&lt;h2&gt;
  
  
  Using an SDK Instead
&lt;/h2&gt;

&lt;p&gt;With a well-designed SDK, the same operation becomes much simpler.&lt;/p&gt;

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

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

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Client&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;your_api_key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;links&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://example.com&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;link&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;short_url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The SDK handles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Authentication&lt;/li&gt;
&lt;li&gt;HTTP requests&lt;/li&gt;
&lt;li&gt;Error handling&lt;/li&gt;
&lt;li&gt;DTO mapping&lt;/li&gt;
&lt;li&gt;API response parsing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;allowing developers to focus on business logic instead of infrastructure.&lt;/p&gt;

&lt;h2&gt;
  
  
  Benefits of Typed SDKs
&lt;/h2&gt;

&lt;p&gt;Modern SDKs provide:&lt;/p&gt;

&lt;h3&gt;
  
  
  Better Developer Experience
&lt;/h3&gt;

&lt;p&gt;Instead of working with raw JSON objects, you work with typed models.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;profile&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;profile&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;me&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;profile&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;profile&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;plan&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Consistent Error Handling
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;links&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://example.com&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="n"&gt;ValidationException&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Validation error&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="n"&gt;UnauthorizedException&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Invalid API key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Easier Maintenance
&lt;/h3&gt;

&lt;p&gt;When the API evolves, the SDK can encapsulate changes without requiring modifications throughout the application.&lt;/p&gt;

&lt;h2&gt;
  
  
  Supporting Multiple Languages
&lt;/h2&gt;

&lt;p&gt;One challenge for API providers is supporting developers across different ecosystems.&lt;/p&gt;

&lt;p&gt;A PHP developer expects Composer packages.&lt;/p&gt;

&lt;p&gt;A JavaScript developer expects npm packages.&lt;/p&gt;

&lt;p&gt;Python developers prefer PyPI.&lt;/p&gt;

&lt;p&gt;Go developers typically install packages directly from GitHub.&lt;/p&gt;

&lt;p&gt;Providing official SDKs for multiple languages significantly lowers the adoption barrier.&lt;/p&gt;

&lt;h2&gt;
  
  
  Building Developer-Friendly APIs
&lt;/h2&gt;

&lt;p&gt;While building Lix.li, I spent considerable time not only designing the API itself, but also creating SDKs for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;PHP&lt;/li&gt;
&lt;li&gt;JavaScript&lt;/li&gt;
&lt;li&gt;Python&lt;/li&gt;
&lt;li&gt;Go&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal was simple: make common tasks like creating and managing short links require as little code as possible.&lt;/p&gt;

&lt;p&gt;You can explore the project here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://lix.li" rel="noopener noreferrer"&gt;https://lix.li&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;A good API is important.&lt;/p&gt;

&lt;p&gt;A good SDK is what makes developers actually want to use it.&lt;/p&gt;

&lt;p&gt;If you're building an API product, investing in SDKs, documentation and developer experience can often have a bigger impact than adding another feature.&lt;/p&gt;

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