Guides & Tutorials

How to Shorten a URL Using API: REST Guide with cURL, Python & Node.js

Super Administrator • October 06, 2026 • 7 min read
How to Shorten a URL Using API: REST Guide with cURL, Python & Node.js

Manual link shortening works fine for sharing an occasional link on social media. But when your application sends thousands of transactional customer invoices, automated SMS dispatch alerts, bulk marketing emails, or dynamic affiliate referral links, manual workflows break down completely. You need programmatic automation.

Learning how to shorten a URL using API enables software engineers, product managers, and automation architects to integrate high-speed link creation directly into backend applications, CRMs, and CI/CD pipelines. In this comprehensive developer guide, we break down REST API authentication, request/response JSON schemas, rate limiting handling, and complete production code samples in cURL, Python, Node.js, and PHP.

Why Automate Link Generation via API?

Programmatic link shortening provides significant operational benefits for engineering teams:

  • Automated E-Commerce Workflows: Generate unique, trackable order confirmation links inside Shopify, WooCommerce, or custom checkout flows automatically.
  • Programmatic SMS & Push Notifications: Shorten long dynamic URLs on the fly before dispatching SMS alerts via Twilio or MessageBird, saving character costs.
  • Dynamic Campaign Generation: Programmatically attach granular UTM tracking parameters for automated marketing attribution. Learn more in our guide on tracking link clicks with UTM parameters.
  • Real-Time Data Integration: Ingest click analytics and conversion webhooks directly into internal analytics data warehouses like Snowflake, BigQuery, or PostgreSQL.

API Architecture & Authentication Overview

Our URL Shortener REST API follows industry-standard architectural principles defined in the IETF RFC 6750 OAuth Bearer Token Standard and the Mozilla Developer Network (MDN) HTTP Overview:

  • Base Endpoint: https://yourdomain.com/api/v1
  • Authentication: Standard HTTP Bearer Token in the authorization header: Authorization: Bearer YOUR_API_KEY
  • Content Negotiation: Accept: application/json and Content-Type: application/json
  • Response Format: Standardized JSON payloads with clear HTTP status codes.

API Endpoint Specification: Create Short URL

To generate a short link, issue an HTTP POST request to the /links endpoint.

Request JSON Body Parameters

Field Name Type Required? Description
original_url String (URL) Required The full destination URL to shorten (must include http/https).
custom_slug String Optional Desired custom vanity alias (e.g., flash-promo-2026).
password String Optional Secret passcode to protect the destination link.
expires_at String (ISO 8601) Optional Expiration timestamp (e.g., 2026-12-31T23:59:59Z).

Expected HTTP 201 Created Response

{
  "success": true,
  "data": {
    "id": 10482,
    "short_url": "https://yourdomain.com/flash-promo-2026",
    "slug": "flash-promo-2026",
    "original_url": "https://example.com/products/sale?discount=20",
    "qr_code_url": "https://yourdomain.com/api/v1/links/10482/qr",
    "clicks_count": 0,
    "created_at": "2026-10-07T03:00:00Z"
  }
}

Production Code Examples in 4 Major Languages

1. cURL (Terminal / Shell Scripting)

curl -X POST "https://yourdomain.com/api/v1/links" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -d '{
    "original_url": "https://myshop.com/products/headphones?promo=fall",
    "custom_slug": "fall-audio"
  }'

2. Python 3 (Using requests library)

import requests

API_URL = "https://yourdomain.com/api/v1/links"
API_TOKEN = "YOUR_API_KEY"

payload = {
    "original_url": "https://myshop.com/products/headphones?promo=fall",
    "custom_slug": "fall-audio"
}

headers = {
    "Authorization": f"Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json"
}

try:
    response = requests.post(API_URL, json=payload, headers=headers, timeout=10)
    response.raise_for_status()
    data = response.json()
    print("Shortened URL successfully created:", data["data"]["short_url"])
except requests.exceptions.HTTPError as err:
    print(f"HTTP Error: {err.response.status_code} - {err.response.text}")
except requests.exceptions.RequestException as err:
    print(f"Network Connection Error: {err}")

3. Node.js / JavaScript (Fetch API with Async/Await)

async function shortenUrl(longUrl, customAlias = null) {
  const apiUrl = 'https://yourdomain.com/api/v1/links';
  const apiToken = 'YOUR_API_KEY';

  const bodyData = {
    original_url: longUrl,
    ...(customAlias && { custom_slug: customAlias })
  };

  try {
    const response = await fetch(apiUrl, {
      method: 'POST',
      headers: {
        'Authorization': `Bearer ${apiToken}`,
        'Content-Type': 'application/json',
        'Accept': 'application/json'
      },
      body: JSON.stringify(bodyData)
    });

    if (!response.ok) {
      const errorDetails = await response.json();
      throw new Error(`API Error [${response.status}]: ${JSON.stringify(errorDetails)}`);
    }

    const result = await response.json();
    console.log('Short URL:', result.data.short_url);
    return result.data;
  } catch (error) {
    console.error('Failed to shorten URL:', error.message);
  }
}

// Example usage:
shortenUrl('https://myshop.com/products/headphones', 'fall-audio');

4. PHP (Using GuzzleHTTP Client)

<?php
require 'vendor/autoload.php';

use GuzzleHttp\Client;
use GuzzleHttp\Exception\ClientException;

$client = new Client([
    'base_uri' => 'https://yourdomain.com/api/v1/',
    'timeout'  => 5.0,
]);

try {
    $response = $client->post('links', [
        'headers' => [
            'Authorization' => 'Bearer YOUR_API_KEY',
            'Accept'        => 'application/json',
            'Content-Type'  => 'application/json',
        ],
        'json' => [
            'original_url' => 'https://myshop.com/products/headphones',
            'custom_slug'  => 'fall-audio',
        ],
    ]);

    $data = json_decode($response->getBody(), true);
    echo "Shortened URL: " . $data['data']['short_url'] . PHP_EOL;
} catch (ClientException $e) {
    echo "Request Error: " . $e->getResponse()->getBody()->getContents() . PHP_EOL;
}
?>

HTTP Status Codes and Error Handling

Robust applications must handle standard HTTP response codes gracefully:

  • 201 Created: Link created successfully. Response contains link payload and QR image reference.
  • 400 Bad Request: Malformed request payload or missing required original_url parameter.
  • 401 Unauthorized: Missing or invalid API bearer token. Verify your key in account settings.
  • 422 Unprocessable Entity: Validation failed (e.g., custom slug is already claimed by another user or invalid URL structure).
  • 429 Too Many Requests: Rate limit exceeded. Check the Retry-After response header before re-sending requests.
  • 500 Internal Server Error: Unexpected server error. Implement exponential backoff retries.

Rate Limits & Best Practices for High-Volume Systems

  1. Implement Exponential Backoff: If your application encounters an HTTP 429 status, back off with randomized jitter (e.g., wait 1s, then 2s, then 4s) before retrying.
  2. Cache Generated Links: Store generated short URLs in your local Redis or database cache to prevent creating duplicate short links for identical destination URLs.
  3. Sanitize User Input: Validate that URLs passed from frontend users are valid web URIs with HTTP/HTTPS protocols before forwarding them to the API.

Frequently Asked Questions (FAQ)

Where do I get my API key?

Registered users can generate and manage API keys inside their account dashboard under the API & Developers tab.

Can I retrieve click analytics programmatically via the API?

Yes! Our REST API includes comprehensive analytics endpoints (e.g., GET /api/v1/links/{id}/analytics) that return click counts, referrers, country heatmaps, and device stats in JSON format.

Does the API support dynamic QR code generation?

Yes. Every created link returns a companion QR code endpoint that outputs both high-resolution PNG and vector SVG graphics for immediate print integration.

Start Building with Our Developer API Today

Automate your link infrastructure in minutes with an API designed for developers, built for speed, and backed by high-availability cloud infrastructure.

Explore our full API Documentation or test our interactive shortener on our homepage today!

Ready to Brand and Track Your Links?

Create custom branded short URLs, generate vector QR codes, and monitor click analytics with FreeURLShort completely free.

Popular & Recommended

Latest Articles

Continue reading our expert link optimization and URL management guides.

View All Articles
How to Detect and Avoid Malicious Short Links: Phishing & Scam Protection Guide
Link Security & Trust
How to Detect and Avoid Malicious Short Links: Phishing & Scam Protection Guide

Protect yourself from online fraud. Learn how cybercriminals exploit URL shorteners to hide phishing...

Oct 06, 2026 Read Article →
How to Use a Custom Domain with a URL Shortener: Complete Setup Guide
Guides & Tutorials
How to Use a Custom Domain with a URL Shortener: Complete Setup Guide

Learn how to use a custom domain with a URL shortener. Boost brand trust by up to 34%, configure CNA...

Oct 06, 2026 Read Article →
How to Password Protect a Link: Secure File Sharing & Confidential URLs
Link Security & Trust
How to Password Protect a Link: Secure File Sharing & Confidential URLs

Learn how to password protect a link to safeguard confidential documents, staging servers, and priva...

Oct 06, 2026 Read Article →