Free & Open Access · No API Key Required

GifSnap Public API

Embed GIFs and stickers in your app, website, or mobile project. All media URLs are served directly from gifsnap.com — no Tenor, Giphy, or third-party brand links exposed to your users.

GifSnap URLs
No third-party brands
No Auth
Free, open access
Paginated
page & limit params
REST JSON
Simple HTTP GET

Overview

The GifSnap API aggregates GIFs from multiple sources (Giphy, Tenor, Klipy) and serves them through a unified interface. All media is proxied through gifsnap.com, so your users never see a Tenor or Giphy URL.

Base URL: https://gifsnap.com/api/v1
Note: This is a free, best-effort API. For high-volume production use, consider caching responses on your end.

Quick Start

No API key needed. Pick a language and make your first request:

const res = await fetch(
  "https://gifsnap.com/api/v1/gifs/search?q=funny+cats&page=1&limit=10"
);
const { data, pagination } = await res.json();

data.forEach(gif => {
  const img = document.createElement("img");
  img.src = gif.url; // gifsnap.com proxy URL
  document.body.appendChild(img);
});

Example response:

{
  "data": [
    {
      "id": "giphy_abc123",
      "title": "Funny Cats Compilation",
      "url": "https://gifsnap.com/api/v1/media/aHR0cHM6Ly9tZWRpYS...",
      "preview_url": "https://gifsnap.com/api/v1/media/aHR0cHM6Ly9tZWRpYS...",
      "width": 480,
      "height": 270,
      "type": "gif",
      "source": "giphy"
    }
  ],
  "pagination": {
    "page": 1,
    "limit": 10,
    "total": 84,
    "has_next": true,
    "next_page": 2,
    "offset": 0
  },
  "query": "funny cats"
}

Endpoints

All endpoints are GET requests that return JSON. No authentication required.

GET/api/v1/gifs/{id}

Get metadata for a single GIF by its ID. The ID is returned in search/trending results.

Path Parameters

id*stringGIF ID from a previous search/trending result (e.g. giphy_abc123)
const res = await fetch(
  "https://gifsnap.com/api/v1/gifs/giphy_abc123"
);
const gif = await res.json();
console.log(gif.url); // https://gifsnap.com/api/v1/media/...

Response:

{
  "id": "giphy_abc123",
  "title": "Funny Cats Compilation",
  "url": "https://gifsnap.com/api/v1/media/aHR0cHM6Ly9tZWRpYS...",
  "preview_url": "https://gifsnap.com/api/v1/media/aHR0cHM6Ly9tZWRpYS...",
  "width": 480,
  "height": 270,
  "type": "gif",
  "source": "giphy",
  "created_at": "2025-03-22T10:00:00"
}
GET/api/v1/media/{id}

Serves the actual GIF/WebM/WebP file. All search and trending results return URLs pointing here — you don't need to call this directly.

URLs from the search and trending endpoints already point to this proxy. Just use the url field directly in an <img> or <video> tag.
<!-- Use the url field from API responses directly: -->
<img src="https://gifsnap.com/api/v1/media/aHR0cHM6Ly9tZW..." />

<!-- Response headers include:
  Content-Type: image/gif (or video/webm, image/webp)
  Cache-Control: public, max-age=31536000, immutable
  Access-Control-Allow-Origin: *
-->
GET/api/v1/stats

Returns statistics about the GifSnap media library.

const res = await fetch("https://gifsnap.com/api/v1/stats");
const stats = await res.json();
console.log(`${stats.total_gifs} GIFs indexed`);

Response:

{
  "total_gifs": 12480,
  "cached_gifs": 9341,
  "unique_tags": 847,
  "total_searches": 5203,
  "estimated_storage_mb": 1121.0,
  "status": "ok",
  "api_version": "v1"
}

Response Format

All list endpoints return a consistent JSON structure with a data array and a pagination object.

GIF Object

FieldTypeDescription
idstringUnique GIF identifier (e.g. giphy_abc123, klipy_456)
titlestringHuman-readable title for the GIF
urlstringgifsnap.com proxy URL for the GIF/video file — use in <img> or <video>
preview_urlstringPreview/thumbnail URL (also a gifsnap.com proxy URL)
widthintegerWidth in pixels
heightintegerHeight in pixels
typestring'gif' or 'sticker'
sourcestringOriginal content source: 'giphy', 'tenor', or 'klipy'

Pagination Object

FieldTypeDescription
pageintegerCurrent page number
limitintegerResults per page
totalintegerTotal results available (approximate for live searches)
has_nextbooleanWhether a next page is available
next_pageinteger | nullNext page number, or null if on the last page
offsetintegerZero-based offset of the first result on this page

Pagination

Use the page and limit query parameters to paginate through results. The pagination.next_page field gives you the next page number, or null when you've reached the end.

async function* fetchAllGifs(query) {
  let page = 1;
  while (page) {
    const res = await fetch(
      `https://gifsnap.com/api/v1/gifs/search?q=${encodeURIComponent(query)}&page=${page}&limit=25`
    );
    const result = await res.json();
    yield* result.data;
    page = result.pagination.next_page;
  }
}

// Usage:
for await (const gif of fetchAllGifs("cats")) {
  console.log(gif.url);
}

Rate Limits

The GifSnap API is currently free with no authentication required. There are no hard rate limits, but please be considerate:

  • Cache API responses on your side to reduce redundant requests.
  • Avoid polling the API in tight loops — use pagination instead.
  • The media proxy (/api/v1/media/...) caches aggressively — browsers and CDNs will cache media for up to 1 year.
Need higher throughput?

For high-volume production use, cache responses in Redis or a CDN. The media URLs are immutable, so you can safely cache them indefinitely.

Start building today

No sign-up, no API key. Just make a request.